多文件的Go包,如何组织结构

12

Go小白,我似乎无法弄清楚如何使用包来构建我的项目。我想要这个:

  • 我想要创建一个名为Dart的包。
  • 我在我的项目目录中有一个名为dart.go的文件,它带有包main和主函数。
  • 我还有另一个文件,叫做functions.go,在我的项目目录中,并且第一行是“package dart”。
  • 我只想从主函数中调用functions.go里面的函数,但是无法弄清楚如何命名包以使其构建成功。
  • 如果我在functions.go的顶部放置package dart,它将无法构建,因为它会发现包main和dart。我不想让functions.go成为另一个包的一部分,我只想要一个包并且能够将这个包中的函数拆分成多个文件。
  • 在Go语言中是否有可能实现这一点,或者我必须要创建多个包?

dart.go

package main 

import (
  ...
)  

func main () {
  ...
  // call functions declared in functions.go
  ...
}

函数.go

package dart  

import (
  ...
)

func Function1() {
  ... 
}

func Function2() {
  ...
}

4
这些问题在如何编写Go代码中有涉及。 - Charlie Tumahai
1
谢谢,我确实阅读了这篇文章和其他资源。对我来说问题在于我错误地认为'package main'是每个包只使用一次的特殊声明。 - bitwitch
3个回答

22

如果你只想访问不同文件中的函数,请确保 functions.go 文件也以 package main 而非 package dart 开头。这样,你就可以在一个包内工作,但代码被分成多个文件。请确保它们在同一目录下,以便将其视为同一包。


5
我曾经认为每个包只能有一个main包声明,这是我的先入之见。很傻,这样的想法阻止我看到一些如此简单的东西。谢谢。 - bitwitch
3
对于那些像我一样,dart.go似乎无法访问Function1的人: 请使用go run .而不是go run dart.go。请参见此处的解释。 - Josiah Plett

4
正如 Wombologist 提到的,如果它们共享相同的package定义,那么您可以毫无问题地在同一包下分割不同的文件。唯一的例外是测试中有不同的包定义,在这种情况下,建议的方式是在包名后面添加_test(例如package main_testpackage dart_test)。
我不确定这是否适用于您的情况,或者您只是尝试使用该语言,但我想说的是,当您将同一域代码分组到软件包中并在各个模块之间共享时,Go项目更易于维护,并且增加了可重用性。

4
如果您只是想创建一个库,那么您就不需要一个主要的包。但是,如果您想创建一个可以运行来自不同包(dartlib)中函数的独立程序,则需要一个主文件。
给程序取一个与您调用的库名称不同的名字也是个好主意(程序 dart 调用 dartlib)。 您的库目录结构应该如下所示:
dartlib
|
 dartlib.go

dartlib.go

package dartlib

function Hello() string { return "hello!" }

这可以作为以下内容进行导入:"github.com/your_github_username/dartlib"

程序

或者,您可以将软件包存储在程序目录中。在这种情况下,目录结构应该像下面这样:

dart (you_program_name)
|
 dart.go
 dartlib (package)
 |
  dartlib.go

在这种情况下,库可以导入如下:"github.com/your_github_username/dart/dartlib"

dart.go

package main

import (
 "github.com/your_github_username/dart/dartlib"
 "fmt"
)

helloString := dartlib.Hello()
fmt.Println(helloString)

在根目录下运行go build .会生成可执行文件dart
使用$./dart hello!可以运行该文件。
更多示例和详细说明请参见文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接