go - 为什么我不能在 golang 中将 main 添加到我的库中?

标签 go package program-entry-point code-organization

我在完成本应轻松完成的任务时遇到了困难。我了解用于代码组织的 GitHub 模型(即库存储库和使用库的应用程序存储库)。我认为这太棒了。但我经常发现我希望 mylib 与单个 main.go 文件中的简单可执行文件捆绑在一起。 main.go 应该是 package main 并且应该导入 mylib。换句话说,它应该是关于如何构建使用此库的应用程序的准确文档。

我的观点是,由于提供一个简单的命令行界面来包装您的库通常就足够方便了,因此应该有一种简单的方法可以做到这一点而无需创建另一个 repo,而 golang 应该会有所帮助。

我想要如下内容:

$GOPATH/src/github.com/me/mylib
    mylib.go
    mylib_also.go
    main.go

其中 mylib 是库(package mylib),main.gopackage main 并且在运行时go install 它生成bin/mylibpkg/mylib.a

要么 main.go 应该导入 "github.com/me/mylib"(如果我现在这样做,我会得到循环导入错误)或者 go 会理解正在发生的事情,因为应该内置此功能,并且 repo 中的 main.go 会生成 exec。可能需要导入(并删除循环错误)是更好的方法。

现在,我要做

$GOPATH/src/github.com/me/mylib
    mylib/
        mylib.go
    main.go

所以我必须导入 github.com/me/mylib/mylib 这很荒谬。

总之,go install 应该允许包的特殊情况和导入包并提供演示包 API 的简单 cli 的 main。 GitHub模型提倡两个repos,但是简单的clis合二为一应该很容易吧!

最佳答案

每个文件夹不能有多个包。 Go 在包级别而不是文件级别运行。

在这种情况下的惯例——一个消耗你的库的二进制文件——是用你的主包创建一个 cmd 文件夹 - 即根据 https://github.com/bradfitz/camlistore/tree/master/cmdhttps://github.com/boltdb/bolt

在您的情况下,这将是:

$GOPATH/src/github.com/me/mylib
    mylib/
      mylib.go
      README.md
      cmd/
        your-lib-tool/
          main.go

关于go - 为什么我不能在 golang 中将 main 添加到我的库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25318589/

相关文章:

go - 将带有 null 的 bigquery 行映射到结构后出现异常

go - 为什么在64位arch中mod 8为4后Go的4bytes对齐结构地址?

go - 有没有一种方法可以在golang中为多个结构重用功能?

c++ - R: 安装feather包时编译报错 "ISO C++ forbids in-class initialization of non-const static member"

python - 如何获取 Python 编译时使用的选项列表?

java - Java 中的主类。叫什么?

templates - 访问排序对列表的第一项

node.js - Npm 安装失败,出现 "cannot run in wd"

python - 我应该在 main() 内部还是外部定义函数?

c - 可以生成多少个参数以及为什么会生成它们?