我在Go中有一个简短的程序,其中包含以下文件。 程序目录结构:
myprogram/
main.go
server.go
routines.go
structs.go
这些不同的文件包含不同的功能。 structs.go
文件包含已定义的结构类型列表,并在我的程序的多个文件中使用。我现在要做的是将程序拆分为包,如下例所示:
main/
main.go // the main program
server/
server.go // a package imported in main
routines/
routines.go // a package imported in main
我的问题是,我不知道放在structs.go
的哪个位置,因为它包含多个包中使用的结构,例如' main.go'代码。
如何有效地共享此structs.go
文件?我应该在我定义的每个包中包含它(通过符号链接到文件),即server
和routines
以及主要的?
我的方法可能很尴尬,因为我是Go的初学者,一般是编程。
答案 0 :(得分:11)
不要在软件包之间链接文件,这是不好的做法。首先,代码将被复制。另一方面,标识符将被复制,意味着表示相同的实体(例如类型或功能),但它们将是不同的。例如。如果链接且structs.go
包含type Response
定义,则您将有2种不同的类型server.Response
和routines.Response
更多的混淆。
一种解决方案是将structs.go
放入自己的包中,例如model
以及依赖它的所有其他软件包都可以将其导入(例如main
,server
和routines
)。
在一个理论示例中:如果包A
导入包B
并且两者都需要structs.go
,那么它也可以添加到包B
中。如果某个包C
只需要structs.go
,那么创建自己的包model
会更明智(因此包C
并不需要导入/了解包B
,只包含新的model
包。)
此外,如果没有其他人会使用您的软件包并且它不是太复杂,那么将它组织到多个软件包中可能不值得。
答案 1 :(得分:0)
可以只在一个包中定义一个类型,然后以这种方式在其他包中使用它:
package one
type A struct{ B int }
变种1:
package two
. import "one"
var name A
变种2:
package two
import "one"
type A = one.A
var name A
我希望使用变体2。