美文网首页
对 golang range 行为的一个误解

对 golang range 行为的一个误解

作者: 逆麟囧 | 来源:发表于2015-06-12 14:20 被阅读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 中的三个元素都是同一个指针.
    记下来.

    相关文章

      网友评论

          本文标题:对 golang range 行为的一个误解

          本文链接:https://www.haomeiwen.com/subject/tvvjqttx.html