不能在 go 的赋值中用作类型

新手上路,请多包涵

当我编译我的代码时,我收到以下错误消息,不知道为什么会这样。有人可以帮我指出为什么吗?先感谢您。

不能在赋值中使用 px.InitializePaxosInstance(val)(PaxosInstance 类型)作为 *PaxosInstance 类型

type Paxos struct {
    instance   map[int]*PaxosInstance
}

type PaxosInstance struct {
    value        interface{}
    decided      bool
}

func (px *Paxos) InitializePaxosInstance(val interface{}) PaxosInstance {
    return PaxosInstance {decided:false, value: val}
}

func (px *Paxos) PartAProcess(seq int, val interface{}) error {
    px.instance[seq] = px.InitializePaxosInstance(val)
    return nil

}

原文由 vkosyj 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 273
2 个回答

您的地图需要一个指向 PaxosInstance ( *PaxosInstance ) 的指针,但您正在向它传递一个结构值。更改 Initialize 函数以返回一个指针。

 func (px *Paxos) InitializePaxosInstance(val interface{}) *PaxosInstance {
    return &PaxosInstance {decided:false, value: val}
}

现在它返回一个指针。您可以使用 & 变量的指针,如果您需要结构值本身,请使用 * 再次取消引用它。

在一行之后

x := &PaxosInstance{}

或者

p := PaxosInstance{}
x := &p

x 的值类型是 *PaxosInstance 。如果你需要,你可以将它解引用回 PaxosInstance 结构值

p = *x

您通常不希望将结构作为实际值传递,因为 Go 是按值传递的,这意味着它将复制整个结构。将结构值与映射和切片一起使用通常会导致逻辑错误,因为如果您迭代它们或以其他方式引用它们(除了通过索引),就会创建一个副本。这取决于您的用例,但您的标识符 Instance 会推断您希望避免重复和此类逻辑错误。

至于阅读编译器错误,您可以看到它告诉您的内容。类型 PaxosInstance 和类型 *PaxosInstance 不一样。

原文由 RayfenWindspear 发布,翻译遵循 CC BY-SA 4.0 许可协议

Paxos 结构中的 instance 字段是指向 PaxosInstance 结构 指针 的整数键映射。

你打电话时:

 px.instance[seq] = px.InitializePaxosInstance(val)

您正在尝试将具体的(非指针) PaxosInstance 结构分配给 px.instance 的元素,这是指针。

您可以通过在 InitializePaxosInstance 中返回指向 PaxosInstance 的指针来缓解这种情况,如下所示:

 func (px *Paxos) InitializePaxosInstance(val interface{}) *PaxosInstance {
    return &PaxosInstance{decided: false, value: val}
}

或者您可以修改 Paxos 结构中的 instance 字段,使其不是指针映射:

 type Paxos struct {
    instance   map[int]PaxosInstance
}

您选择哪个选项取决于您的用例。

原文由 vase 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏