【问题标题】:Using function from file in outer package使用外包文件中的函数
【发布时间】:2020-01-07 15:04:25
【问题描述】:

我是这里的 Golang 初学者,正在为如何使用外部包中的函数而苦恼

我这里有源代码,就像下面这棵树

-samplego
--pkg
--src
---github.com
----pkg1
-----a.go
-----pkg2
-------b.go

在 b.go 中,我想使用 a.go 中的函数,但编译器告诉我,即使我将函数声明为 public(第一个字符为大写字母),该函数也是未定义的。

我想知道在使用之前我是否必须从 a.go 导入任何东西,但我想我会得到循环导入,因为在 a.go 中也使用来自 b.go 的函数。

谢谢。

【问题讨论】:

  • Go 中没有“外部”包。并且没有“内部”或“父级”或诸如此类的包。所有的包裹都是平等的。 (为真正的学究而挑剔:stdlib、内部和供应商有额外的规则)。如果你想使用包中的任何东西,你必须导入它,不,你不能循环导入,在这种情况下你必须重新设计。

标签: go backend


【解决方案1】:

也许,a.go 和 pkg2 是平的,所以,你为什么不改变你的文件视图,比如:

-samplego --pkg --src ---github.com ----pkg1 -----a.go -----b.go

如果你想保持你的文件结构,你应该使用 mod,等我一段时间。 -samplego --pkg --src ---github.com ----pkg1 -----a.go -----pkg2 -------b.go 下面的命令: bash cd $(SAMPLEGO_PATH) // change path to samplego exists go mod init samplego 在b.go中,导入“samplego/src/github.com/pkg1”,然后通过pkg1.function从a.go导入函数; 在a.go中,导入“samplego/src/github.com/pkg1/pkg2”,然后通过pkg2.function从b.go中导入函数;

【讨论】:

    【解决方案2】:

    不幸的是,直到 Go2 才允许循环依赖。你想要做的事情可以用当前的 Go 版本来完成。您可以重构代码以创建包含数据结构和必须导出的方法的包 C。 请记住,您需要使用go mod init YOUR_MODEL_NAME,然后您可以使用import YOUR_MODEL_NAME/package_name 从另一个文件中调用该方法(记住必须导出)。请记住,每个文件夹只能包含一个包。

    【讨论】:

    • OP 说:“在 b.go 中,我想使用 a.go 中的函数。在 a.go 中也使用 b.go 中的函数。我想我会得到循环导入。”您如何回答 OP 的问题?
    • 从@peterSO 所说的,这是否意味着不可能做到?我应该改为更改代码结构吗?你有什么建议吗?我现在很困惑:(
    • 如果是公共回购,请提供链接。不幸的是,直到 Go2 才允许循环依赖
    猜你喜欢
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多