go range,go语言关键字,浅析Go语言中的Range关键字

go range,go语言关键字,浅析Go语言中的Range关键字

它是Range语言中一个独特的关键字,使用起来相当方便。下面让我们和边肖一起讨论这个范围关键字。有需要的朋友可以参考一下。

前言

相信用过range的朋友都知道,Go语言中的Range关键字使用起来非常方便。它允许您遍历一个切片或映射,并通过两个参数(index和value)获得切片或映射中某个元素的索引和值。

比如像这样的用法:

对于索引,值:=range mySlice {

fmt。Println('索引: '索引')

fmt。Println('值: '值')

}

上面的例子清楚地描述了range的用法。其实在使用range关键字的时候,有几点是需要特别注意的。有一些新手很容易入的“坑”。

为了说明这些”坑”,我们可以从下面这个稍复杂的例子说起:

Foo struct类型{

酒吧字符串

}

func main() {

list :=[]Foo{

{'A'},

{'B'},

{'C'},

}

list2 :=make([]*Foo,len(list))

对于I,值:=范围列表{

list2[i]=值

}

fmt。Println(列表[0],列表[1],列表[2])

fmt。Println(列表2[0],列表2[1],列表2[2])

}

在这个例子中,我们干了下面的一些事情:

1.一个名为Foo的结构是用一个名为bar的字段定义的。然后,我们创建了一个基于Foo结构的切片,命名为list。

2.我们还基于Foo结构的指针类型创建了一个切片,称为list2。

3.在for循环中,我们试图遍历列表中的每个元素,获取其指针地址,并将其赋给list2中index的相应位置。

4.最后,分别输出list和list2中的每个元素。

当然,从代码的角度来看,预期的结果应该如下:

{A} {B} {C}

{A} {B} {C}

但结果却出乎意料。程序的输出是这样的:

{A} {B} {C}

{C} {C} {C}

从结果来看,似乎list2中的三个元素都指向list中的最后一个元素。这是为什么呢?问题出在上面的for…range循环。

在Go的for…range循环中,Go总是使用值副本,而不是遍历的元素本身。简单地说,for…range中的值是一个值副本,而不是元素本身。这样,当我们期望用得到一个元素的指针地址时,实际上我们得到的只是临时变量值的指针地址,而不是列表中实际遍历的一个元素的指针地址。在整个for…range循环中,临时变量值将被重用。因此,在上面的例子中,list2填充了三个相同的指针地址,并且这三个地址都指向value。在最后一个循环中,value被赋予{c}的指针地址。因此,当输出list2时,显示三个{c}。

同样,下面的写法与…范围的例子完全相同:

var值Foo

对于var I:=0;i len(列表);我{

值=列表[i]

list2[i]=值

}

如果我们输出list2的三个元素,结果是一样的:{C} {C} {C}

那么,正确的写法是什么呢?我们应该使用index来访问for…范围中的实数元素,并获取它的指针地址:

对于I,_ :=范围列表{

列表2[i]=列表[i]

}

这样,通过输出list2中的元素,我们就可以得到想要的结果({A} {B} {C})。

实验代码如下:

主包装

导入' fmt '

Foo struct类型{

酒吧字符串

}

func main() {

list :=[]Foo{

{'A'},

{'B'},

{'C'},

}

list2 :=make([]*Foo,len(list))

//错误示例

对于I,值:=范围列表{

list2[i]=值

}

//正确的例子

//对于I,_ :=范围列表{

//list2[i]=list[i]

//}

fmt。Println(列表[0],列表[1],列表[2])

fmt。Println(列表2[0],列表2[1],列表2[2])

}

知道了靶场的正确使用姿势,那么我们下面的例子也就可以解决了:

主包装

导入' fmt '

类型MyType结构{

字段字符串

}

func main() {

变量数组[10]MyType

for _,e :=范围数组{

e.field='foo '

}

for _,e :=范围数组{

fmt。打印(电场)

fmt。Println(' -')

}

}

编写代码最常见的场景是我们需要修改循环中被遍历元素的值。例如,在上面的例子中,我们希望使用for…range循环将数组中每个元素的字段一次性设置为“foo”。同样,因为范围值是复制的,所以上面的程序不会输出任何内容.

而正确的做法是:

对于I,_ :=范围数组{

数组[i]。field='foo '

}

通过index访问每个元素并修改其字段,这样就可以输出一串“foo”.

实验代码如下:

主包装

导入' fmt '

类型MyType结构{

字段字符串

}

func main() {

变量数组[10]MyType

对于I,_ :=范围数组{

数组[i]。field='foo '

}

for _,e :=范围数组{

fmt。打印(电场)

}

}

总结

这就是Go语言中Range关键字的全部内容。这篇文章很详细。相信这篇文章对你学习Go语言会有一定的参考价值。如果您有任何问题,您可以留言,边肖将尽快回复您。请继续支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: