有没有一种有效的方法在Golang包之间共享结构体?

25

我在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)以及main中都包含它(通过符号链接到该文件)吗?

我的方法可能很笨拙,因为我是Go语言和编程的初学者。


没有必要将东西分成自己的包。问问自己:这种分割实际上带来了什么好处?现在再与成本进行比较。 - Volker
目标是在于将这些程序包重复使用到其他程序中,而不仅仅是在“主程序”中使用。 - ElieLie
2个回答

20
不要跨包链接文件,这是不好的做法。首先,代码会被复制。其次,标识符也会被复制来表示相同的实体(例如类型或函数),但它们将是不同的。例如,如果链接并且structs.go包含type Response定义,则将有2个不同类型server.Responseroutines.Response,这只会更加混乱。
一个解决方案是将structs.go放入其自己的包中,例如model,并且所有依赖于它的其他包可以导入它(例如您的mainserverroutines)。
在理论上的例子中:如果包A导入了包B,并且在两者中都需要structs.go,那么它也可以添加到包B中。如果有一个只需要structs.go的包C,那么再次创建自己的model包就更明智了(因此包C不需要导入/知道包B,只需了解新的model包即可)。
此外,如果没有人使用您的包,并且它不太复杂,那么将其组织成多个包可能不值得麻烦。

1
好的,所以你建议我创建一个结构体包,例如 model。 谢谢你的回答,我希望这是Go语言中的一个好习惯。 - ElieLie
4
据我所知(并在IRC上被告知),Go不鼓励创建模型包。参见:https://medium.com/@benbjohnson/standard-package-layout-7cdbc8391fc1 和 https://rakyll.org/style-packages/,这只是其中两个例子。 - pandaadb

1

在一个包中定义类型,然后可以通过以下方式在其他包中使用它:

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

我更喜欢第二个变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接