为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
holdtom 2021-11-22 10:48:52
我对 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从主导入。


查看完整回答
反对 回复 2021-11-22
?
慕慕森

TA贡献1856条经验 获得超17个赞

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

type ResultEvent struct {
    name  string
    desc  string}

值得检查导出与未导出的含义,但基本上大写表示导出,这类似于public其他系统语言中的说明符。小写表示未导出,更像是internalprivate

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


查看完整回答
反对 回复 2021-11-22
?
临摹微笑

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 以及读取名称和描述的方法。


查看完整回答
反对 回复 2021-11-22
  • 3 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信