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

标签 go structure package

我在 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 文件?我是否应该将它(通过文件的符号链接(symbolic link))包含在我定义的每个包中,即 serverroutines 以及 main 中?

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

最佳答案

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

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

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

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

关于go - 有没有一种在 golang 包之间共享结构的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35576337/

相关文章:

parsing - 如何比较两个源代码文件/ast 树?

go - 在Go中将html字符串解析为模板

loops - 去审核-循环变量我被func文字捕获

C : Acessing a structure within a structure

c - C中struct中数组和字符串的动态内存分配

javascript - _ 在 Meteor 包中使用时无法识别

GoLang-术语框 : panic: open/dev/tty: no such device or address

Java 打包和导入 - 我的错误在哪里?

go - 如何在Workiva/go-data structures/中使用b tree/plus

c++ - 结构对齐/字节顺序检查