首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在go中作为赋值类型使用

无法在go中作为赋值类型使用
EN

Stack Overflow用户
提问于 2017-05-10 19:04:57
回答 3查看 52.1K关注 0票数 21

当我编译我的代码时,我会收到以下错误消息,不知道为什么会发生这种情况。有人能帮我指出原因吗?提前谢谢你。

不能将px.InitializePaxosInstance(val) (PaxosInstance类型)用作赋值中的类型*PaxosInstance

代码语言:javascript
运行
复制
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 

}

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-10 19:10:17

您的映射需要一个指向PaxosInstance (*PaxosInstance)的指针,但您要将一个struct值传递给它。更改Initialize函数以返回指针。

代码语言:javascript
运行
复制
func (px *Paxos) InitializePaxosInstance(val interface{}) *PaxosInstance {
    return &PaxosInstance {decided:false, value: val}
}

现在它返回一个指针。您可以使用&获取变量的指针,如果需要结构值本身,可以使用*取消引用。

在像这样的一行之后

代码语言:javascript
运行
复制
x := &PaxosInstance{} 

代码语言:javascript
运行
复制
p := PaxosInstance{}
x := &p

x的值类型是*PaxosInstance。如果您需要的话,可以将它取消引用到PaxosInstance结构值中。

代码语言:javascript
运行
复制
p = *x

您通常不希望将结构作为实际值传递,因为Go是逐值传递的,这意味着它将复制整个事件。使用带有映射和切片的struct值通常会导致逻辑错误,因为除非通过索引,否则如果您迭代或引用它们,就会生成副本。这取决于您的用例,但是您的标识符Instance会推断您希望避免重复和这样的逻辑错误。

至于读取编译器错误,您可以看到它在告诉您什么。类型PaxosInstance和类型*PaxosInstance并不相同。

票数 26
EN

Stack Overflow用户

发布于 2017-05-10 19:13:21

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

当你打电话:

代码语言:javascript
运行
复制
px.instance[seq] = px.InitializePaxosInstance(val)

您正在尝试将一个具体的(而不是指针) PaxosInstance结构分配给px.instance的一个元素,该元素是指针。

可以通过在PaxosInstance中返回指向InitializePaxosInstance的指针来缓解这一问题,如下所示:

代码语言:javascript
运行
复制
func (px *Paxos) InitializePaxosInstance(val interface{}) *PaxosInstance {
    return &PaxosInstance{decided: false, value: val}
}

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

代码语言:javascript
运行
复制
type Paxos struct {
    instance   map[int]PaxosInstance
}

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

票数 6
EN

Stack Overflow用户

发布于 2021-01-08 16:09:26

对于其他人来说:看看你的进口品。

不确定它何时开始发生,但是我的Visual + gopls安装程序偶尔会插入一个导入行,它引用的是我的依赖项路径,而不是原始的导入路径。我通常不会捕捉到这一点,直到我开始抛光代码发布,或出现类似的错误。

在我的例子中,这导致了另外两种相同类型的不相等的比较。一旦修复了导入,这就解决了错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43900806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档