我有一个 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
以及 main 中?
我的方法可能很尴尬,因为我是 Go 和编程的初学者。
不要跨包链接文件,这是不好的做法。其一,代码会重复。另一方面,标识符将是重复的,意味着表示相同的实体(例如类型或函数),但它们将是不同的。例如。如果链接并且
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
套餐)。
此外,如果没有其他人会使用您的包并且它不是太复杂,那么可能不值得将其组织到多个包中。
可以仅在一个包中定义一种类型,并以这种方式在其他包中使用它:
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。
从 golang 1.18 开始,您可以使用 go.work 文件创建工作空间。 注意:这不会解决包之间共享结构的问题,但您可以在同一包中的文件之间共享结构。 在下面的示例中,“ONE”类型用于实例化整个 XPTO 模块。这种类型的任何变量都可以访问接收者 *ONE 的所有方法,无论您在包内的文件是什么。
文件A xpto 包 输入一个结构体 {}
文件B 包 xpto
C文件 包 xpto