当我编译我的代码时,我收到以下错误消息,不知道为什么会发生。有人可以帮我指出原因吗?提前谢谢。
不能使用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
}
答案 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
的元素,这些元素是指针。
您可以通过返回指向PaxosInstance
中InitializePaxosInstance
的指针来缓解此问题,如下所示:
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 设置偶尔会插入一个导入行,该行引用我的供应商依赖项路径而不是原始导入路径。在我开始完善代码以供发布之前,我通常不会发现这个问题,否则会弹出这样的错误。
在我的情况下,这导致两个其他相同的类型无法相等地进行比较。一旦我修复了我的导入,这个错误就解决了。