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.Level
0
打电话后还留着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)
参见相关: