更新时间:
#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)
}
}