当我编译我的代码时,我会收到以下错误消息,不知道为什么会发生这种情况。有人能帮我指出原因吗?提前谢谢你。
不能将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
}
发布于 2017-05-10 19:10:17
您的映射需要一个指向PaxosInstance
(*PaxosInstance
)的指针,但您要将一个struct值传递给它。更改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是逐值传递的,这意味着它将复制整个事件。使用带有映射和切片的struct值通常会导致逻辑错误,因为除非通过索引,否则如果您迭代或引用它们,就会生成副本。这取决于您的用例,但是您的标识符Instance
会推断您希望避免重复和这样的逻辑错误。
至于读取编译器错误,您可以看到它在告诉您什么。类型PaxosInstance
和类型*PaxosInstance
并不相同。
发布于 2017-05-10 19:13:21
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
}
您选择的选项取决于您的用例。
发布于 2021-01-08 16:09:26
对于其他人来说:看看你的进口品。
不确定它何时开始发生,但是我的Visual + gopls安装程序偶尔会插入一个导入行,它引用的是我的依赖项路径,而不是原始的导入路径。我通常不会捕捉到这一点,直到我开始抛光代码发布,或出现类似的错误。
在我的例子中,这导致了另外两种相同类型的不相等的比较。一旦修复了导入,这就解决了错误。
https://stackoverflow.com/questions/43900806
复制相似问题