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

gam*_*ter 14 methods struct go

我收到了 linting 错误

ineffective assignment to field Player.Level (SA4005)go-staticcheck
Run Code Online (Sandbox Code Playgroud)

当我尝试使用结构方法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
}
Run Code Online (Sandbox Code Playgroud)

p.Level0打电话后还留着p.LevelUp()。调用更新该方法所附加的结构体字段值的方法的正确方法是什么?

输出:

Player level 0
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 24

包括接收者在内的每个参数在进入函数/方法时都会被复制。当您返回时,对副本所做的更改将会丢失。这就是为什么你会收到警告:你修改了一个你从未使用过的字段:你在赋值后的方法中没有使用它,并且你不可能在其他任何地方使用它,因为从方法返回后,作业丢失。

如果需要保留更改,则必须使用指针接收器 ( p *Player) 并修改指向的对象(p.Level++将这样做)。

func (p *Player) LevelUp() {
    p.Level++
}
Run Code Online (Sandbox Code Playgroud)

这将输出(在Go Playground上尝试):

Player level 1
Run Code Online (Sandbox Code Playgroud)

参见相关:

即使我使用指向类型的指针来更新我的对象也不会更新

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

为什么我不能附加到 golang 中结构体属性的切片?