golang for range注意事项

type t struct {
    n int
}

func main() {
    m := map[string]t{
        "1": t{1},
        "2": t{2},
        "3": t{3},
        "4": t{4},
    }
    a := []*t{}
    for _, v := range m {
        a = append(a, &v)
    }
    fmt.Println(a)
}

以上代码,对一个 object 数组或 map 进行遍历,对每个元素取地址,循环结束后,a中的4个元素都是 t{4}!!因为 for 循环中的 v,在循环结束后被赋值为最后一个元素!
map 元素类型换成基本的 int,或者 interface{} , 结果都是一样。

正确的用法:

    for k, _ := range m {
        a = append(a, &m[k])
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。