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

pftdvrlh  于 9个月前  发布在  Go
关注(0)|答案(4)|浏览(115)

我有一个简短的程序在去与以下文件的一部分。程序目录结构:

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的初学者,一般来说也是编程的初学者。

cunj1qz1

cunj1qz11#

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

i1icjdpr

i1icjdpr2#

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

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


我更喜欢第二种。

k5hmc34c

k5hmc34c3#

从golang 1.18开始,你可以使用go.work文件来创建一个工作区。注意:这不会解决包之间共享结构体的问题,但是你可以在同一个包中的文件之间共享结构体。在下面的例子中,“ONE”类型用于示例化整个XPTO模块。任何这种类型的变量都可以访问所有接收器为 *ONE的方法,无论你在包中的文件是什么。
文件A包xpto类型ONE结构{}
文件B包xpto
File C package xpto
来源:https://go.dev/doc/tutorial/workspaces

fquxozlt

fquxozlt4#

一般来说,尽量使结构体接近它们的用例,我们通常使用以下方法(尽管它非常依赖于上下文,所以与其说是一条规则,不如说是一个指南):

/web/model/...         // API request/response types
/model/...             // DTOs used internally throughout the app
/repo/items/...        // or /repo/entity/... Objects persisted to DB
/service/interfaces.go // to describe the service layer in full, sometimes struct DTOs makes sense there

字符串
我也会避开“structs.go”文件-通常每个文件都有一个结构体更好,因为你可以更清楚地添加编组和其他行为-并命名文件对齐,例如:

/web/model/create_order_request.go
/web/model/create_order_response.go

相关问题