我是Go的新手,有这个"设计"问题
我有一个主程序通过渠道传递工作。每个工作最终都会在一个单独的"工人"包。工作是结构。
现在我想要调用每个函数,通过"结果"将结果作为公共结构返回。渠道。但是包不知道我在main中的结构定义,所以我无法定义它。
package main
type resultEvent struct {
name string
desc string
}
然后在工作包中:
package worker
func Test() {
result := &resultEvent{name: "test"}
}
当然,这个想法是最终将这个结果发送到一个频道,但即便是这个简单的例子也无法工作,因为工作人员不知道resultEvent。 这样做的正确方法是什么?
更新
应该注意的是,会有很多工人包,做不同的事情。排序"插件" (根本不可插拔)。 我不想在每个go文件中定义冗余结构,然后必须在50个非常不同的工作包中维护它。
我正在寻找构造它的正确方法,所以我可以为所有工人包重用一个结构。
答案 0 :(得分:4)
基本上,package main
中的任何内容都只能从该pacakge中引用。如果您希望在多个包之间共享它,请将其放在worker
包中并将其导出(大写第一个字母),然后从main导入worker
。
答案 1 :(得分:2)
无论如何,您都必须导入包含您要使用的类型的包。但是,这不适合您的原因是因为您的类型未导出。您需要将类型名称大写为大写;
type ResultEvent struct {
name string
desc string
}
值得检查导出vs未导出的方法,但基本上大写意味着导出类似于其他系统语言中的public
说明符。小写意味着未导出,更像是internal
或private
。
正如在评论和其他答案中所指出的那样,您无法导入main,所以我相信您也必须移动您的类型定义。
答案 2 :(得分:1)
一种可能的方式是:
package workerlib
type ResultEvent struct {
Name string // Export the struct fields, unless you have a
Description string // real good reason not to.
}
然后将其余的worker实用程序函数粘贴到该包中。除非您提供合适的方法来读取事件中的名称和描述,否则只需导出字段即可。如果您绝对需要仅在其定义的包中进行更改,则可以保留它们未导出,然后提供创建ResultEvent的函数以及读取名称和描述的方法。