go 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)
		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])
}
评论