go程序开发者们很容易犯的for循环陷阱

简介: go程序使用for循环需要注意的一点,不然会踩坑的

看如下的go程序demo

循环读取一个slice,把读取的值放入另一个slice

packagemainimport"fmt"typeFoostruct {
barstring}
funcmain() {
list := []Foo{
        {"A"},
        {"B"},
        {"C"},
    }
list2 :=make([]*Foo, len(list))
fori, value :=rangelist {
//fmt.Printf("%p\n",&value)list2[i] =&value    }
fmt.Println(list[0], list[1], list[2])
fmt.Println(list2[0], list2[1], list2[2])
}


理想中的预期运行结果应该是

{A} {B} {C}
&{A} &{B} &{C}


但是当你实际运行后,结果不是这样了

{A} {B} {C}
&{C} &{C} &{C}


为什么是这样的结果呢?

首先我们应该知道, for 循环中,初始变量会被重用,例如: ivalue ,在 for 之前被分配内存地址,之后循环只是一直对这个内存地址重新赋值,我们可以把代码注释去掉看看执行结果

0xc0001041e0
0xc0001041e0
0xc0001041e0
{A} {B} {C}
&{C} &{C} &{C}

从执行结果中,可以看到内存地址一样,而在for循环最后元素时, value的值是 C,而 &value是一个指向 value的内存地址,如果想得到预期的结果该怎么做

packagemainimport"fmt"typeFoostruct {
barstring}
funcmain() {
list := []Foo{
        {"A"},
        {"B"},
        {"C"},
    }
list2 :=make([]*Foo, len(list))
fori, value :=rangelist {
//每次循环都重新声明一个变量temp:=valuefmt.Printf("%p\n",&temp)
list2[i] =&temp    }
fmt.Println(list[0], list[1], list[2])
fmt.Println(list2[0], list2[1], list2[2])
}


运行结果

0xc0001041e0
0xc0001041f0
0xc000104200
{A} {B} {C}
&{A} &{B} &{C}


希望开发者写代码过程中,注意这个坑,不然很容易犯这个错误

目录
相关文章
|
Rust 前端开发 rax
Go的闭包看你犯错,但Rust的lifetime却默默帮你排坑
Go有GC因此很多程序员也不关注对象的释放问题,不过一旦与闭包结合就容易出现问题,本文对此进行排坑,并介绍Rust的做法
|
SQL 算法 Java
【Go语言刷题篇】Go从0到入门5:Map综合复习、条件语句、循环语句练习
本期是学习Golang:Map综合复习、条件语句、循环语句练习,有不懂的地方可以评论进行讨论!
【Go语言刷题篇】Go从0到入门5:Map综合复习、条件语句、循环语句练习
|
Go 索引
一文熟悉 Go 的循环结构 —— for 循环
我是陈明勇,本文分享的知识是 Go 的循环结构。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!
167 1
一文熟悉 Go 的循环结构 —— for 循环
|
Java Go 索引
Go 语言中的 Slice 陷阱:如何避免常见错误
Go 语言提供了很多方便的数据类型,其中包括 slice。然而,由于 slice 的特殊性质,在使用过程中易犯一些错误,如果不注意,可能导致程序出现意外行为。本文将详细介绍 使用 slice 时易犯的一些错误,帮助读者更好的使用 Go 的 slice,避免犯错误。
241 1
Go 语言中的 Slice 陷阱:如何避免常见错误
Go中都是值传递,切记! 你所了解的引用传递等知识经验从今天开始彻底抛弃!
Go中都是值传递,切记! 你所了解的引用传递等知识经验从今天开始彻底抛弃!
|
存储 缓存 安全
90%的Go语言程序员map遍历方式都是错的
90%的Go语言程序员map遍历方式都是错的
225 0
|
Java 程序员 Python
十个Python程序员易犯的错误
十个Python程序员易犯的错误
|
算法 Go
Go语言打印九九乘法表,这是整洁代码范例
Go语言打印九九乘法表,这是整洁代码范例
140 0
|
存储 自然语言处理 程序员
Go 语言入门很简单 -- 5. 控制结构 #私藏项目实操分享#
Go 语言入门很简单 -- 5. 控制结构 #私藏项目实操分享#
220 0
Go 语言入门很简单 -- 5. 控制结构 #私藏项目实操分享#

热门文章

最新文章