【问题标题】:Go package with multiple files, how to structureGo打包多个文件,如何构造
【发布时间】:2019-10-08 04:55:21
【问题描述】:

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

  • 我想创建一个包,比如说它叫 Dart。
  • 我的项目目录中有一个名为 dart.go 的文件,其中包含 main 包和 main 函数。
  • 我有另一个文件,在我的项目目录中将其命名为functions.go,第一行是'package dart'。
  • 我只想在 main 中调用 functions.go 中的函数,但不知道如何命名包来构建它。
  • 如果我将包 dart 放在 functions.go 的顶部,它不会构建,因为它会找到包 main 和 dart。我不想要函数。去 要成为另一个包的一部分,我只想要一个包以及将这个包中的功能拆分为多个文件的能力。
  • 这是否可行,还是我必须制作多个包?

dart.go

package main 

import (
  ...
)  

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

functions.go

package dart  

import (
  ...
)

func Function1() {
  ... 
}

func Function2() {
  ...
}

【问题讨论】:

  • How to Write Go Code 涵盖了这些问题。
  • 谢谢,我确实阅读了此资源和其他资源。对我来说,问题是我错误地认为 'package main' 是一个特殊声明,每个包只使用一次。

标签: go package


【解决方案1】:

正如Wombologist 提到的,您可以毫无问题地将不同的文件拆分到同一个包下,假设它们共享相同的package 定义。同一目录下不同包定义的唯一例外是测试,其中定义包的推荐方法是在其上添加_test(例如package main_testpackage dart_test)。

不确定这是您的情况,还是您只是在尝试该语言,但我要补充一点,当您将相同的域代码分组到包下并共享它们时,Go 项目更易于维护,从而增加了潜在的可重用性。

【讨论】:

    【解决方案2】:

    如果您只是想创建一个库,那么您不需要主包。但是,如果您希望创建一个运行来自不同包 (dartlib) 的功能的独立程序,那么您将需要一个主文件。

    将程序命名为与您正在调用的库不同的名称也是一个好主意(program dart calling library 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!

    有关更多示例和进一步说明,请参阅docs

    【讨论】:

      【解决方案3】:

      如果您只想访问不同文件中的函数,请让 functions.go 也以 package main 而不是 package dart 开头。这样,您在单个包中工作,但您的代码分为多个文件。确保它们位于同一个目录中,以便将它们考虑在同一个包中。

      【讨论】:

      • 我想我有一个先入为主的想法,每个包只能有一个包主声明。愚蠢的,这让我看不到这么简单的东西。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 2023-03-26
      • 2019-05-13
      • 2013-03-20
      • 2018-02-06
      • 2011-10-04
      • 2013-07-11
      相关资源
      最近更新 更多