当我编译我的代码时,我得到以下错误信息,不知道为什么会发生。2有人能帮我指出原因吗?3提前谢谢你。
不能在赋值中将px.InitializePaxosInstance(瓦尔)(类型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条答案
按热度按时间krugob8w1#
您的map需要一个指向
PaxosInstance
(*PaxosInstance
)的指针,但您正在向它传递一个结构体值。更改Initialize函数以返回一个指针。现在它返回一个指针。你可以使用
&
获取一个变量的指针,如果你需要结构体本身的值,可以再次使用*
解引用它。在一句像
或
x
的值类型是*PaxosInstance
。如果需要,可以使用以下命令将其解引用回PaxosInstance
结构体值你通常不希望将结构体作为实际值传递,因为Go是按值传递的,这意味着它会复制整个结构体。将结构体值与Map和切片一起使用通常会导致逻辑错误,因为如果你迭代它们或以其他方式引用它们,除非通过索引。这取决于你的用例,但您的标识符
Instance
将推断您希望避免重复和此类逻辑错误。至于阅读编译器错误,你可以看到它告诉你什么。类型
PaxosInstance
和类型*PaxosInstance
是不一样的。u5rb5r592#
Paxos
结构体中的instance
字段是整型键到PaxosInstance
结构体的 * 指针 * 的Map。当您致电:
您试图将一个具体的(不是指针)
PaxosInstance
结构体分配给px.instance
的一个元素,这些元素是指针。您可以通过在
InitializePaxosInstance
中返回指向PaxosInstance
的指针来缓解此问题,如下所示:或者你可以修改
Paxos
结构中的instance
字段,使其不是指针Map:选择哪一个选项取决于您的用例。
ckx4rj1h3#
对于那些把头发扯下来的人:检查一下你的进口货。
我不知道它是什么时候开始发生的,但我的Visual Studio Code + gopls安装程序偶尔会插入一个导入行,引用我的vendored依赖项路径,而不是原始导入路径。我通常不会发现这个问题,直到我开始为发布而优化代码,或者弹出这样的错误。
在我的例子中,这导致两个相同的类型不能进行相等的比较。一旦我修复了我的导入,这就解决了错误。