#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)
    }
}