不能在go中的赋值中使用as类型

djmepvbi  于 2023-04-09  发布在  Go
关注(0)|答案(3)|浏览(130)

当我编译我的代码时,我得到以下错误信息,不知道为什么会发生。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 
}
krugob8w

krugob8w1#

您的map需要一个指向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是按值传递的,这意味着它会复制整个结构体。将结构体值与Map和切片一起使用通常会导致逻辑错误,因为如果你迭代它们或以其他方式引用它们,除非通过索引。这取决于你的用例,但您的标识符Instance将推断您希望避免重复和此类逻辑错误。
至于阅读编译器错误,你可以看到它告诉你什么。类型PaxosInstance和类型*PaxosInstance是不一样的。

u5rb5r59

u5rb5r592#

Paxos结构体中的instance字段是整型键到PaxosInstance结构体的 * 指针 * 的Map。
当您致电:

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字段,使其不是指针Map:

type Paxos struct {
    instance   map[int]PaxosInstance
}

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

ckx4rj1h

ckx4rj1h3#

对于那些把头发扯下来的人:检查一下你的进口货。
我不知道它是什么时候开始发生的,但我的Visual Studio Code + gopls安装程序偶尔会插入一个导入行,引用我的vendored依赖项路径,而不是原始导入路径。我通常不会发现这个问题,直到我开始为发布而优化代码,或者弹出这样的错误。
在我的例子中,这导致两个相同的类型不能进行相等的比较。一旦我修复了我的导入,这就解决了错误。

相关问题