我对 Go 很陌生并且有这个“设计”问题。我有一个通过渠道传递工作的主程序。每个作业都将在单独的“worker”包中定义的函数中结束。作业是结构。现在我希望调用的每个函数都通过“结果”通道将结果作为公共结构返回。但是包不知道我在 main 中的结构定义,所以我无法定义它。package maintype resultEvent struct { name string desc string}然后在一个工人包中:package workerfunc Test() { result := &resultEvent{name: "test"}} 当然,这个想法是最终将这个结果发送到一个通道,但即使是这个简单的例子也行不通,因为 worker 不知道 resultEvent。这样做的正确方法是什么?更新:需要注意的是会有很多worker包,做不同的事情。有点像“插件”(只是根本不可插入)。我不想在每个 go-file 中定义一个冗余的结构,然后必须维护超过 50 个非常不同的工作包。我正在寻找构建它的正确方法,因此我可以为所有工作包重用一个结构。
3 回答
蛊毒传说
TA贡献1895条经验 获得超3个赞
基本上,任何存在于其中的东西package main
都只能从该包中引用。如果你想让它在多个包之间共享,把它放在worker
包中并导出(大写第一个字母),然后worker
从主导入。
慕慕森
TA贡献1856条经验 获得超17个赞
无论如何,您都必须导入包含您要使用的类型的包。但是,这对您不起作用的原因是您的类型未导出。您需要将类型名称大写,例如;
type ResultEvent struct { name string desc string}
值得检查导出与未导出的含义,但基本上大写表示导出,这类似于public
其他系统语言中的说明符。小写表示未导出,更像是internal
或private
。
正如评论和其他答案中所指出的,您不能导入 main 所以我相信您也必须移动您的类型定义。
临摹微笑
TA贡献1982条经验 获得超2个赞
一种可能的方法是:
package workerlib
type ResultEvent struct {
Name string // Export the struct fields, unless you have a
Description string // real good reason not to.
}
然后将其余的工作实用程序函数粘贴到该包中。除非您提供合适的方法从事件中读取名称和描述,否则只需导出字段。如果您绝对需要使它们仅在定义它们的包内可更改,则可以保持它们未导出,然后提供一个函数来创建 ResultEvent 以及读取名称和描述的方法。
- 3 回答
- 0 关注
- 155 浏览
添加回答
举报
0/150
提交
取消