Golang range 的一些坑

栏目: Go · 发布时间: 6年前

内容简介:先举个栗子:我们期望的结果是但是实际输出的结果是

先举个栗子:

package main

import (
    "fmt"
)

type Foo struct {
    Bar string
}

func main() {
    list := []Foo{Foo{"bar1"}, Foo{"bar2"}, Foo{"bar3"}}
    for i, v := range list {
        v.Bar = "change" + string(i)
    }
    fmt.Println(list)
}

我们期望的结果是

[{change1} {change2} {change3}]

但是实际输出的结果是

[{test1} {test2} {test3}]

为什么没有改变? 其实 for range 中的 v 是一个数组元素值的拷贝, 而不是数组元素本身。所以,修改数组元素需要使用下标进行修改。栗子中 for range 修改成

for i, _ := range list {
    list[i].Bar = "change" + string(i)
}

小考题:

package main

import (
    "fmt"
)

func main() {
    a := []int{1, 2, 3}
    for _, v := range a {
        fmt.Println(&v)
    }
}

上面代码每次输出是否是一样?

答案:是一样的。

解析:for range 中的 v 只会声明初始化一次,不会每次循环都声明初始化。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

支付革命

支付革命

马梅、朱晓明、周金黄、季家友、陈宇 / 中信出版社 / 2014-2-1 / 49.00元

本书是中国首部深入探讨第三方支付的著作。 本书以电子交易方式、电子货币及电子认证技术演变的“三重奏”将决定电子支付中介的发展为主线,分析了中国第三方支付从“小支付”走向“大金融”的历史逻辑、技术逻辑和商业逻辑,揭示了第三方支付特别是创新型第三方支付机构发展对提升中国经济运行效率的作用,分析了第三方支付的未来发展趋向,并提出了相应的政策建议。 本书旨在以小见大,立足于揭示互联网与移动互联......一起来看看 《支付革命》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具