为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 包和文件夹中构建代码?

如何在 Go 包和文件夹中构建代码?

Go
鸿蒙传说 2021-12-20 11:01:53
我已经阅读了涵盖这个问题的各种文章,并且有很多不同的方法。我是 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代码的部分

现在,请记住,这确实是一个复杂性问题。拥有许多文件但低复杂性并不能证明子包的合理性。


查看完整回答
反对 回复 2021-12-20
?
莫回无

TA贡献1865条经验 获得超7个赞

这里有两个“解决方案”。

1) 将代码放回主包中,直到您知道如何处理它为止(这是我的建议)

2) 创建一个定义 Person 类型的 person 包并将该包导入到两者中。我认为 person.Person 很傻,这就是为什么我不会这样做。database.Person 或 server.Person 对我来说更有意义。我的意思是在这一点上,这一切都归结为你如何阅读、写作和存储 Person,这还不清楚。


查看完整回答
反对 回复 2021-12-20
  • 2 回答
  • 0 关注
  • 217 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号