我已经阅读了涵盖这个问题的各种文章,并且有很多不同的方法。我是 Go 的新手,我正在努力学习最佳实践,而不是一开始就选择一些不好的风格。来自有课程的语言,我在学习 Go 等新语言时尽量不应用我多年来学到的一切。这提出了我的第一点:在 Go 中使用包和文件夹来组织你的程序是否被认为是一种好风格?从我到目前为止所读到的内容来看,有些人建议这样做,所以我选择了这样的结构(我的实际程序要大得多,因此符合“将代码移动到包”的方法):.├── bin│ └── helloworld└── src ├── github.com │ ├── SOMEUSER │ │ └── helloworld │ │ ├── main.go │ │ ├── main_test.go │ │ ├── greeter │ │ │ └── talker.go │ │ └── person.go因此,如您所见,我将一些新代码移到了一个单独的包中,在这种情况下将是greeter. 我在我的 main.go 文件中导入了这个包(我已经多次阅读,建议使用这种方法而不是像 那样进行导入import ./greeter):package mainimport "github.com/SOMEUSER/helloworld/greeter"func main() { greeter.Hello()}然后调用Hello()我的greeter包中的函数。到现在为止还挺好。但是我的实际问题来了(假设上述结构是在 Go 中构建代码的推荐方式):我现在如何使用在我的main包中的任何文件中声明的任何函数、结构等(在这里我有一些严重的怀疑,这是否是要走的路,没有双关语)?所以让我们假设我在person.go调用中声明了一些结构Person。这个结构现在在我的应用程序的几个部分使用,最好也在我包含的(本地)包中使用它,如下所示:package greeterimport "fmt"func Hello() { p := Person{Name: "Steve"} fmt.Println(p.Name)}尝试构建它时,它会引发undefined: Person错误。如果您能指出我正确的方向,并就 Go 中推荐的方法和风格启发我,我将非常感激。
2 回答

皈依舞
TA贡献1851条经验 获得超3个赞
要使用Person
结构体,您需要导入github.com/SOMEUSER/helloworld
包并像main.Person
. 但是,这是不可能的,因为您无法导入main
包并且会创建循环依赖。
通常,我将以下代码导出到子包中:
与包完全无关的助手
独立的部分,可能是第三方库
相关但不依赖
main
代码的部分
现在,请记住,这确实是一个复杂性问题。拥有许多文件但低复杂性并不能证明子包的合理性。

莫回无
TA贡献1865条经验 获得超7个赞
这里有两个“解决方案”。
1) 将代码放回主包中,直到您知道如何处理它为止(这是我的建议)
2) 创建一个定义 Person 类型的 person 包并将该包导入到两者中。我认为 person.Person 很傻,这就是为什么我不会这样做。database.Person 或 server.Person 对我来说更有意义。我的意思是在这一点上,这一切都归结为你如何阅读、写作和存储 Person,这还不清楚。
- 2 回答
- 0 关注
- 217 浏览
添加回答
举报
0/150
提交
取消