2015-11-04 38 views
0

对于Go来说这是非常新的并且有这个“设计”问题。如何定义一个全局结构并重用它的包

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

现在我想要调用每个函数,通过“结果”通道将结果作为公共结构返回。但包不知道我在主要的结构定义,所以我不能定义它。

package main 

type resultEvent struct { 
    name string 
    desc string 
} 

然后在一个工人包:

package worker 

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

思路当然是最终发送此结果向下切换一个频道,但即使这个简单的例子不会工作,因为工人犯规了解的ResultEvent。 这样做的正确方法是什么?

更新:

应当指出的是,会有很多工人包,做不同的事情。 Sorta就像“插件”(根本不可插拔)。 我不想在每个go-file中定义一个冗余结构,然后必须维护可能有50个不同的工作包。

我正在寻找什么是正确的方式来构造这个,所以我可以重用一个结构的所有工人包。

+0

downvote的任何解释? – thelogix

回答

1

一种可能的方式是这样的:

package workerlib 

type ResultEvent struct { 
    Name  string // Export the struct fields, unless you have a 
    Description string // real good reason not to. 
} 

然后坚持的工人效用函数的其余部分在该包。除非您提供适当的方法来读取事件的名称和描述,否则只需导出字段。如果您绝对需要使它们只能在定义的包中进行更改,则可以保留它们未导出的内容,然后提供创建ResultEvent的函数以及读取名称和说明的方法。

+0

啊。还没有意识到我需要出口的领域也..我认为这是我正在寻找的答案。 – thelogix

2

无论如何,您将不得不导入包含您要使用的类型的包。但是,这不适合你的原因是因为你的类型没有被导出。你需要大写类型名称,例如;

type ResultEvent struct { 
    name string 
    desc string 
} 

值得检查出什么远销VS未导出的手段,但基本上大写意味着出口这类似于在其他系统语言public符。小写意味着未导出,更像是internalprivate

正如在评论和其他答案中指出的,你不能导入main,所以我相信你也必须移动你的类型定义。

+1

您无法导入主 – captncraig

+0

@ captncraig true,纠正该位。 – evanmcdonnal

+0

做一个“结构”是否合理?go“文件导入,包含我需要的所有结构体?有点像C中的.h文件? – thelogix

4

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

+0

谢谢。不能够引用main,很重要我猜:)我被诱惑认为结构将是全局的。 – thelogix

+1

没有什么是全球性的。一切都在一个包里。 – captncraig

相关问题