对 golang range 行为的一个误解

2015-06-12  本文已影响77人  逆麟囧

代码如下

package main

import (
    "fmt"
)

type Data struct {
    n int
}

func main() {
    data := []Data{
        {1}, {2}, {3},
    }

    // code 1
    res1 := []*Data{}
    for _, one := range data {
        res1 = append(res1, &one)
    }

    fmt.Println("res1", res1)

    // code 2
    res2 := []*Data{}
    var one Data
    for i := 0; i < len(data); i++ {
        one = data[i]
        res2 = append(res2, &one)
    }
    fmt.Println("res2:", res2)

    // code 3
    res3 := []*Data{}
    for i := 0; i < len(data); i++ {
        res3 = append(res3, &data[i])
    }
    fmt.Println("res3:", res3)
}

本以为 range 是类似 code 3 中的行为, 实际上是 code 2 的行为.
也即 res1 中的三个元素都是同一个指针.
记下来.

上一篇下一篇

猜你喜欢

热点阅读