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

问题描述 投票:0回答:3

我有一个 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 和编程的初学者。

go structure package
3个回答
20
投票

不要跨包链接文件,这是不好的做法。其一,代码会重复。另一方面,标识符将是重复的,意味着表示相同的实体(例如类型或函数),但它们将是不同的。例如。如果链接并且

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
套餐)。

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


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。


0
投票

从 golang 1.18 开始,您可以使用 go.work 文件创建工作空间。 注意:这不会解决包之间共享结构的问题,但您可以在同一包中的文件之间共享结构。 在下面的示例中,“ONE”类型用于实例化整个 XPTO 模块。这种类型的任何变量都可以访问接收者 *ONE 的所有方法,无论您在包内的文件是什么。

文件A xpto 包 输入一个结构体 {}

文件B 包 xpto

C文件 包 xpto

来源:https://go.dev/doc/tutorial/workspaces

© www.soinside.com 2019 - 2024. All rights reserved.