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

Is there an efficient way to share structure between golang 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 以及 main 中?

我的方法可能很笨拙,因为我是 Go 的初学者,而且通常是编程方面的初学者。

不要 link 跨包文件,这是不好的做法。其一,代码将被复制。另一方面,标识符将重复意味着表示相同的实体(例如类型或功能),但它们将是不同的。例如。如果 linked 和 structs.go 将包含一个 type Response 定义,您将有 2 种不同的类型 server.Responseroutines.Response 只会更加混乱。

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

理论上的例子:如果包 A 导入包 Bstructs.go 两者都需要,那么它也可以添加到包 B 中。如果有一个包 C 只需要 structs.go,那么再一次创建它自己的包 model 会更明智(所以包 C 不需要导入 /知道包 B,只知道新的 model 包)。

此外,如果没有其他人会使用您的包并且它不是太复杂,那么将它组织成多个包可能不值得麻烦。

可以只在一个包中定义一个类型,然后以这种方式在其他包中使用它:

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。