Golang是有指针概念的,想写好这门语言,避免空指针的错误还是要花点功夫的。先看看例子
package main
import (
"fmt"
)
type Student struct {
Age int
}
func main() {
arr := [3]Student{
{
Age: 10,
},
{
Age: 15,
},
{
Age: 20,
},
}
for _, v := range arr {
v.Age = 0
}
fmt.Println(arr)
}
Output:
[{10} {15} {20}]
值没有改变,因为以上例子没有修改arr里的值,v
是一个副本
把for循环改成以下语句
for i, v := range arr {
println(&arr[i], "vs", &v)
// v.Age = 0
}
Output:
0xc000078f30 vs 0xc000078f20
0xc000078f38 vs 0xc000078f20
0xc000078f40 vs 0xc000078f20
内存地址都不一样,自然无法修改
所以,应该把for循环改成这样
for i := range arr {
arr[i].Age = 0
}
Output:
[{0} {0} {0}]
输出结果Okay