它是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语言会有一定的参考价值。如果您有任何问题,您可以留言,边肖将尽快回复您。请继续支持我们。