【问题标题】:Use a struct that belongs to another package in Golang在 Golang 中使用属于另一个包的结构
【发布时间】:2019-09-14 00:07:14
【问题描述】:

在我的主包中,我有:

type InfoToSend struct {
    id      string
    field1        string
    field2        string
}

我调用一个方法发送:

err = rpc.SendValue(toSend.id, toSend.field1, toSend.field2)

我想将其重构为:

err = rpc.SendValue(toSend)

但在 rpc 包中,我无法访问 main.InfoToSend 结构。

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

有什么办法呢?

【问题讨论】:

  • 您可以创建另一个包来定义您的可共享功能,或者简单地创建一个包来定义您的可共享模型/类型。因此,在您的主应用程序下,您将有一个目录/包“模型”并在那里定义您的类型InfoToSend,您可以在您的rpc 包中重用它models.InfoToSend
  • main是不可导入的,所以你需要将InfoToSend移动到rpc并在那里直接使用或者你可以在另一个importable中声明它,即非主包并让rpcmain 导入该包。
  • @mkopriva 好吧,这就是为什么,谢谢这两个解决方案,但我会选择 mkopriva 解决方案,因为我只有一个模型。

标签: go package


【解决方案1】:

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

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",
})

工作完成。

【讨论】:

  • 是的,这就是我所做的。你的回答很好,但我会稍等一下@mkopriva 发布答案,因为他给了我这个答案作为评论。
  • 愚蠢的挑剔,但在 Go 中,标识符不是“公共”或“私有”,它们是“导出”或“未导出”。
  • @Adrian:是的,通常我是迂腐的:P
猜你喜欢
  • 1970-01-01
  • 2022-01-02
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2016-07-30
  • 2019-05-12
  • 2017-07-23
相关资源
最近更新 更多