使用属于Golang中另一个包的结构

使用属于Golang中另一个包的结构,go,package,Go,Package,在我的主程序包中,我有: type InfoToSend struct { id string field1 string field2 string } 我调用一个方法send: err = rpc.SendValue(toSend.id, toSend.field1, toSend.field2) 我想将其重构为: err = rpc.SendValue(toSend) 但是在rpc包中,我无法访问main.InfoToSe

在我的主程序包中,我有:

type InfoToSend struct {
    id      string
    field1        string
    field2        string
}
我调用一个方法send:

err = rpc.SendValue(toSend.id, toSend.field1, toSend.field2)
我想将其重构为:

err = rpc.SendValue(toSend)
但是在
rpc
包中,我无法访问main.InfoToSend结构

func SendValue(info InfoToSend) error {
...
}

我们能做些什么

让我们从逻辑上来看这一点。这属于哪个域:

type InfoToSend struct {
    id            string
    field1        string
    field2        string
}
它属于
main
还是
rpc
。它是要发送的信息,因此它的名称为
InfoToSend
。这些信息将被发送到哪里?这似乎是远程过程调用的一部分。常识会将这种类型放在
rpc
包中,当然

因此,解决方案很简单,将类型移动到
rpc
包并导出类型+字段:

type InfoToSend struct {
    ID            string
    Field1        string
    Field2        string
}
然后,从主程序包中,只需在
main
程序包中编写以下内容:

err := rpc.SendValue(InfoToSend{
    ID:     "id",
    Field1: "field 1 value",
    Field2: "field 2 value",
})

工作完成。

您可以创建另一个包,在其中定义可共享功能,或者只需创建一个包,在其中定义可共享模型/类型。因此,在主应用程序下,您将有一个dir/package“models”,并在那里定义您的类型
InfoToSend
,您可以在
rpc
package
models中重用它。InfoToSend
package
main
不可导入,因此,您需要将
InfoToSend
移动到
rpc
并直接在那里使用它,或者您可以在另一个可导入的文件包中声明它,即非主文件包,并让
rpc
main
导入该文件包。@mkopriva啊,好的,这就是为什么,谢谢这两个解决方案都可以使用,但我将使用mkopriva解决方案,因为我只有一个模型。是的,我就是这么做的。你的答案很好,但我会等@mkopriva发布一个答案,因为他给了我这个答案作为评论。愚蠢的吹毛求疵,但围棋中的标识符不是“公共的”或“私人的”,它们是“出口的”或“未出口的”。@Adrian:是的,通常我是迂腐的:P