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}]

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