【问题标题】:Is there an efficient way to share structure between golang packages?有没有一种在 golang 包之间共享结构的有效方法?
【发布时间】:2016-06-05 05:15:27
【问题描述】:

我在 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 的初学者,而且一般是编程。

【问题讨论】:

  • 没有必要将东西分离到它自己的包中。问问自己:这种分裂带来了什么实际好处?现在比较一下成本。
  • 目标是在main以外的其他程序中重复使用其中的一些包。

标签: go structure packages


【解决方案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

我更喜欢变体 2。

【讨论】:

    【解决方案2】:

    不要跨包链接文件,这是不好的做法。一方面,代码将被复制。另一方面,标识符将重复,表示相同的实体(例如类型或函数),但它们将是不同的。例如。如果链接和 structs.go 将包含 type Response 定义,您将有 2 个不同的类型 server.Responseroutines.Response 会造成更多的混乱。

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 2013-05-04
    • 2021-11-04
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多