对 golang range 行为的一个误解

代码如下

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

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,935评论 18 399
  • error code(错误代码)=0是操作成功完成。error code(错误代码)=1是功能错误。error c...
    Heikki_阅读 8,727评论 1 9
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,491评论 25 709
  • 标签(空格分隔): STL 运用STL,可以充分利用该库的设计,让我为简单而直接的问题设计出简单而直接的解决方案,...
    认真学计算机阅读 5,348评论 0 10
  • 感恩一直在我身边的天使,扬升大师等高级存有! 虽然知道你们一直在支持着我,引导着我,无需我的任何表达, 但我仍想在...
    玄月之佑阅读 1,930评论 0 2