繁体   English   中英

尝试更新 Go 中的结构时对字段的无效分配

[英]Ineffective Assignment to Field when trying to update a Struct in Go

我收到 linting 错误

ineffective assignment to field Player.Level (SA4005)go-staticcheck

当我尝试使用结构方法LevelUp更新结构的值Player.Level

func main() {
    player := Player{
        Name:  "Tom",
        Level: 0,
    }
    player.LevelUp()
    fmt.Printf("Player level %d\n", player.Level)
}

type Player struct {
    Name  string
    Level int
}

func (p Player) LevelUp() {
    p.Level += 1  // linting error here
}

p.Level在调用p.LevelUp()后也保持0 调用更新此方法附加到的结构的字段值的方法的正确方法是什么?

Output:

Player level 0

输入 function / 方法时复制包括接收器在内的每个参数。 返回时,对副本所做的更改将丢失。 这就是你得到警告的原因:你修改了一个你从不使用的字段:你没有在赋值后的方法中使用,而且你不可能在其他任何地方使用它,因为从方法返回后,效果任务丢失。

如果您需要保留更改,则必须使用指针接收器 ( p *Player ) 并修改指向的 object ( p.Level++将执行此操作)。

func (p *Player) LevelUp() {
    p.Level++
}

这将是 output(在Go Playground上尝试):

Player level 1

见相关:

即使我使用指向类型的指针来更新它,我的 object 也没有更新

Go中如何通过指针接收方法修改简单类型的值?

为什么我不能 append 到一个切片,它是 golang 中结构的属性?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM