对 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 中的三个元素都是同一个指针.
记下来.