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

时间:2016-03-03 09:31:53

标签: 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中推荐的方式和风格,我会非常感激。

2 个答案:

答案 0 :(得分:2)

要使用Person结构,您需要导入github.com/SOMEUSER/helloworld包并像main.Person一样使用它。 但是,这是不可能的,因为您无法导入main包,它会创建循环依赖。

通常,我将以下代码导出到子包中:

  • 与包
  • 完全无关的助手
  • 独立且可能是第三方库的部分
  • main代码
  • 相关但没有依赖关系的部分

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

答案 1 :(得分:1)

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

1)将代码放回主包中,直到你知道如何处理它(这是我的推荐)

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