使用属于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
packagemodels中重用它。InfoToSend
packagemain
不可导入,因此,您需要将InfoToSend
移动到rpc
并直接在那里使用它,或者您可以在另一个可导入的文件包中声明它,即非主文件包,并让rpc
和main
导入该文件包。@mkopriva啊,好的,这就是为什么,谢谢这两个解决方案都可以使用,但我将使用mkopriva解决方案,因为我只有一个模型。是的,我就是这么做的。你的答案很好,但我会等@mkopriva发布一个答案,因为他给了我这个答案作为评论。愚蠢的吹毛求疵,但围棋中的标识符不是“公共的”或“私人的”,它们是“出口的”或“未出口的”。@Adrian:是的,通常我是迂腐的:P