如何全局定义结构并重用它的包

我对 Go 很陌生并且有这个“设计”问题。


我有一个通过渠道传递工作的主程序。每个作业都将在单独的“worker”包中定义的函数中结束。作业是结构。


现在我希望调用的每个函数都通过“结果”通道将结果作为公共结构返回。但是包不知道我在 main 中的结构定义,所以我无法定义它。


package main


type resultEvent struct {

    name  string

    desc  string

}

然后在一个工人包中:


package worker


func Test() {

   result := &resultEvent{name: "test"}

}    

当然,这个想法是最终将这个结果发送到一个通道,但即使是这个简单的例子也行不通,因为 worker 不知道 resultEvent。这样做的正确方法是什么?


更新:


需要注意的是会有很多worker包,做不同的事情。有点像“插件”(只是根本不可插入)。我不想在每个 go-file 中定义一个冗余的结构,然后必须维护超过 50 个非常不同的工作包。


我正在寻找构建它的正确方法,因此我可以为所有工作包重用一个结构。


holdtom
浏览 156回答 3
3回答

蛊毒传说

基本上,任何存在于其中的东西package main都只能从该包中引用。如果你想让它在多个包之间共享,把它放在worker包中并导出(大写第一个字母),然后worker从主导入。

慕慕森

无论如何,您都必须导入包含您要使用的类型的包。但是,这对您不起作用的原因是您的类型未导出。您需要将类型名称大写,例如;type ResultEvent struct {     name  string     desc  string}值得检查导出与未导出的含义,但基本上大写表示导出,这类似于public其他系统语言中的说明符。小写表示未导出,更像是internal或private。正如评论和其他答案中所指出的,您不能导入 main 所以我相信您也必须移动您的类型定义。

临摹微笑

一种可能的方法是:package workerlibtype ResultEvent struct {  Name        string  // Export the struct fields, unless you have a  Description string  // real good reason not to.}然后将其余的工作实用程序函数粘贴到该包中。除非您提供合适的方法从事件中读取名称和描述,否则只需导出字段。如果您绝对需要使它们仅在定义它们的包内可更改,则可以保持它们未导出,然后提供一个函数来创建 ResultEvent 以及读取名称和描述的方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go