在go中不能用作赋值类型

时间:2017-05-10 19:04:58

标签: 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 

}

3 个答案:

答案 0 :(得分:13)

您的地图需要指向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是按值传递,这意味着它将复制整个事物。

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

答案 1 :(得分:4)

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

致电时:

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

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

您可以通过返回指向PaxosInstanceInitializePaxosInstance的指针来缓解此问题,如下所示:

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

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

type Paxos struct {
    instance   map[int]PaxosInstance
}

您选择的选项取决于您的使用案例。

答案 2 :(得分:1)

对于其他拔头发的人:检查您的进口商品。

不确定它何时开始发生,但我的 Visual Studio Code + gopls 设置偶尔会插入一个导入行,该行引用我的供应商依赖项路径而不是原始导入路径。在我开始完善代码以供发布之前,我通常不会发现这个问题,否则会弹出这样的错误。

在我的情况下,这导致两个其他相同的类型无法相等地进行比较。一旦我修复了我的导入,这个错误就解决了。