有没有一种有效的方法来共享golang包之间的结构?

时间:2016-02-23 11:28:13

标签: go structure packages

我在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文件?我应该在我定义的每个包中包含它(通过符号链接到文件),即serverroutines以及主要的?

我的方法可能很尴尬,因为我是Go的初学者,一般是编程。

2 个答案:

答案 0 :(得分:11)

不要在软件包之间链接文件,这是不好的做法。首先,代码将被复制。另一方面,标识符将被复制,意味着表示相同的实体(例如类型或功能),但它们将是不同的。例如。如果链接且structs.go包含type Response定义,则您将有2种不同的类型server.Responseroutines.Response更多的混淆。

一种解决方案是将structs.go放入自己的包中,例如model以及依赖它的所有其他软件包都可以将其导入(例如mainserverroutines)。

在一个理论示例中:如果包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。