更新时间: 2022-10-08 02:11:55#go for range 坑package main import "fmt" /** 在for循环中,声明了一个i变量,每次循环将i的地址追加到out切片中, 但是每次追加的其实都是i变量,因此我们追加的是一个相同的地址,而该地址最终的值是3。 range坑, 每次 */ func main() { var out []*int for i := 0; i < 3; i++ { // i := i // 解开 out = append(out, &i) // todo error fmt.Println(i) } fmt.Println("----") fmt.Println("值:", *out[0], *out[1], *out[2]) fmt.Println("地址:", out[0], out[1], out[2]) } func test1() { a1 := []int{1, 2, 3} a2 := make([]*int, len(a1)) // 其中的v是一个局部变量,只会声明初始化一次,之后每次循环时重新赋值覆盖前面的, // 所以给a2[i]赋值的时候其实都是同一个地址&v,而v最终的值为a1最后一个元素的值,也就是3。 for i, v := range a1 { // todo range 每次都是v 变量 a2[i] = &v } fmt.Println("值:", *a2[0], *a2[1], *a2[2]) fmt.Println("地址:", a2[0], a2[1], a2[2]) } 再来一个 package main import ( "fmt" ) type student struct { Name string Age int } func main() { //定义map m := make(map[string]*student) //定义student数组 stus := []student{ {Name: "zhou", Age: 24}, {Name: "li", Age: 23}, {Name: "wang", Age: 22}, } //将数组依次添加到map中 for _, stu := range stus { m[stu.Name] = &stu // todo error } // fix 遍历结构体数组,依次赋值给map for i := 0; i < len(stus); i++ { m[stus[i].Name] = &stus[i] } //打印map for k,v := range m { fmt.Println(k ,"=>", v.Name) } }