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

时间:2015-11-04 22:00:50

标签: go

我是Go的新手,有这个"设计"问题

我有一个主程序通过渠道传递工作。每个工作最终都会在一个单独的"工人"包。工作是结构。

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

package main

type resultEvent struct {
    name  string
    desc  string
}

然后在工作包中:

package worker

func Test() {
   result := &resultEvent{name: "test"}
}    

当然,这个想法是最终将这个结果发送到一个频道,但即便是这个简单的例子也无法工作,因为工作人员不知道resultEvent。 这样做的正确方法是什么?

更新

应该注意的是,会有很多工人包,做不同的事情。排序"插件" (根本不可插拔)。 我不想在每个go文件中定义冗余结构,然后必须在50个非常不同的工作包中维护它。

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

3 个答案:

答案 0 :(得分:4)

基本上,package main中的任何内容都只能从该pacakge中引用。如果您希望在多个包之间共享它,请将其放在worker包中并将其导出(大写第一个字母),然后从main导入worker

答案 1 :(得分:2)

无论如何,您都必须导入包含您要使用的类型的包。但是,这不适合您的原因是因为您的类型未导出。您需要将类型名称大写为大写;

type ResultEvent struct {
    name  string
    desc  string
}

值得检查导出vs未导出的方法,但基本上大写意味着导出类似于其他系统语言中的public说明符。小写意味着未导出,更像是internalprivate

正如在评论和其他答案中所指出的那样,您无法导入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的函数以及读取名称和描述的方法。