我已阅读过涉及此问题的各种文章,并且有很多不同的方法。 我是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中推荐的方式和风格,我会非常感激。
答案 0 :(得分:2)
要使用Person
结构,您需要导入github.com/SOMEUSER/helloworld
包并像main.Person
一样使用它。
但是,这是不可能的,因为您无法导入main
包,它会创建循环依赖。
通常,我将以下代码导出到子包中:
main
代码现在,请记住,这确实是一个复杂的问题。拥有许多文件但复杂度低并不能证明子包是合理的。
答案 1 :(得分:1)
这里有两个“解决方案”。
1)将代码放回主包中,直到你知道如何处理它(这是我的推荐)
2)创建一个定义Person类型的person包,并将该包导入两者。我认为person.Person很傻,这就是我不这样做的原因。 database.Person或server.Person对我来说更有意义。我的意思是,在这一点上,这一切都取决于你如何阅读,写作和存储人,这一点还不清楚。