猿问

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

我已经阅读了涵盖这个问题的各种文章,并且有很多不同的方法。我是 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 main


import "github.com/SOMEUSER/helloworld/greeter"


func main() {

    greeter.Hello()

}

然后调用Hello()我的greeter包中的函数。到现在为止还挺好。


但是我的实际问题来了(假设上述结构是在 Go 中构建代码的推荐方式):


我现在如何使用在我的main包中的任何文件中声明的任何函数、结构等(在这里我有一些严重的怀疑,这是否是要走的路,没有双关语)?


所以让我们假设我在person.go调用中声明了一些结构Person。这个结构现在在我的应用程序的几个部分使用,最好也在我包含的(本地)包中使用它,如下所示:


package greeter


import "fmt"


func Hello() {

    p := Person{Name: "Steve"}

    fmt.Println(p.Name)

}

尝试构建它时,它会引发undefined: Person错误。


如果您能指出我正确的方向,并就 Go 中推荐的方法和风格启发我,我将非常感激。


鸿蒙传说
浏览 219回答 2
2回答

皈依舞

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

莫回无

这里有两个“解决方案”。1) 将代码放回主包中,直到您知道如何处理它为止(这是我的建议)2) 创建一个定义 Person 类型的 person 包并将该包导入到两者中。我认为 person.Person 很傻,这就是为什么我不会这样做。database.Person 或 server.Person 对我来说更有意义。我的意思是在这一点上,这一切都归结为你如何阅读、写作和存储 Person,这还不清楚。
随时随地看视频慕课网APP

相关分类

Go
我要回答