时间:2021-05-22
前言
Go 中的for range组合可以和方便的实现对一个数组或切片进行遍历,但是在某些情况下使用for range时很可能就会被"坑",下面用一段代码来模拟下:
func main() { arr1 := []int{1, 2, 3} arr2 := make([]*int, len(arr1)) for i, v := range arr1 { arr2[i] = &v } for _, v := range arr2 { fmt.Println(*v) }}代码解析:
从代码上看,打印出来的结果应该是
1
2
3
然而真正的结果是
3
3
3
原因
因为for range在遍历值类型时,其中的v变量是一个值的拷贝,当使用&获取指针时,实际上是获取到v这个临时变量的指针,而v变量在for range中只会创建一次,之后循环中会被一直重复使用,所以在arr2赋值的时候其实都是v变量的指针,而&v最终会指向arr1最后一个元素的值拷贝。
来看看下面这个代码,用for i来模拟for range,这样更易于理解:
func main() { arr1 := []int{1, 2, 3} arr2 := make([]*int, len(arr1)) var v int for i:=0;i<len(arr1);i++ { v = arr1[i] arr2[i] = &v } for _, v := range arr2 { fmt.Println(*v) }}解决方案
传递原始指针
使用临时变量
使用闭包
官方提示
由于这一问题过于普遍,Golang甚至将其写入了文档的『常见错误』部分:文档
到此这篇关于详解Go语言中for range的"坑"的文章就介绍到这了,更多相关Go语言for range内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
zap.Logger是go语言中相对日志库中性能最高的。那么如何开始使用?不多说直接上代码:import("encoding/json""fmt""log""g
Arrays:数组在go语言中数组array是一组特定长度的有序的元素集合。复制代码代码如下:packagemainimport"fmt"funcmain(){
Go语言中encoding/json包可以很方便的将结构体、数组、字典转换为json字符串。引用import"encoding/json"解析语法//v传入结构
1、变量声明和赋值语法Go语言中的变量声明使用关键字var,例如复制代码代码如下:varnamestring//声明变量name="tom"//给变量赋值这边v
详解C语言中Char型指针数组与字符数组的区别1.char类型的指针数组:每个元素都指向一个字符串,指向可以改变char*name[3]={"abc","def