来源:自学PHP网 时间:2019-08-07 16:47 作者:小飞侠 阅读:次
[导读] 浅析Go语言中的Range关键字...
前言 相信用过Range的朋友们都知道,Go语言中的range关键字使用起来非常的方便,它允许你遍历某个slice或者map,并通过两个参数( 比如像这样的用法: for index, value := range mySlice { fmt.Println("index: " + index) fmt.Println("value: " + value) } 上面的例子足够清晰的描述了range的用法,实际上在使用range关键字的时候,还有一些需要特别注意的地方,有一些新手很容易入的”坑”。 为了说明这些”坑”,我们可以从下面这个稍复杂的例子说起: type Foo struct { bar string } func main() { list := []Foo{ {"A"}, {"B"}, {"C"}, } list2 := make([]*Foo, len(list)) for i, value := range list { list2[i] = &value } fmt.Println(list[0], list[1], list[2]) fmt.Println(list2[0], list2[1], list2[2]) } 在这个例子中,我们干了下面的一些事情: 1、定义了一个叫做Foo的结构,里面有一个叫bar的field。随后,我们创建了一个基于Foo结构体的slice,名字叫list 2、我们还创建了一个基于Foo结构体指针类型的slice,叫做list2 3、在一个 4、最后,分别输出list与list2中的每个元素 从代码来看,理所当然,我们期望得到的结果应该是这样: {A} {B} {C} &{A} &{B} &{C} 但是结果却出乎意料,程序的输出是这样的: {A} {B} {C} &{C} &{C} &{C} 从结果来看,仿佛list2中的三个元素,都指向了list中的最后一个元素。这是为什么呢?问题就出在上面那一段 在Go的 同样的,下面的写法,跟 var value Foo for var i := 0; i < len(list); i++ { value = list[i] list2[i] = &value } 如果我们输出list2的三个元素,结果同样是: 那么,怎样才是正确的写法呢?我们应该用 for i, _ := range list { list2[i] = &list[i] } 这样,输出list2中的元素,就能得到我们想要的结果 实验代码如下: package main import "fmt" type Foo struct { bar string } func main() { list := []Foo{ {"A"}, {"B"}, {"C"}, } list2 := make([]*Foo, len(list)) //错误的例子 for i, value := range list { list2[i] = &value } //正确的例子 //for i, _ := range list { // list2[i] = &list[i] //} fmt.Println(list[0], list[1], list[2]) fmt.Println(list2[0], list2[1], list2[2]) } 了解了range的正确使用姿势,那么我们下面这个例子也能迎刃而解了: package main import "fmt" type MyType struct { field string } func main() { var array [10]MyType for _, e := range array { e.field = "foo" } for _, e := range array { fmt.Println(e.field) fmt.Println("--") } } 平常写代码最常见的场景,就是我们需要在一个循环中修改被遍历元素的值。比如上面这个例子,我们希望能使用 而正确的做法是: for i, _ := range array { array[i].field = "foo" } 通过index访问每个元素,并修改其field,这样,就能输出一堆”foo”了…… 实验代码如下: package main import "fmt" type MyType struct { field string } func main() { var array [10]MyType for i, _ := range array { array[i].field = "foo" } for _, e := range array { fmt.Println(e.field) } } 总结 以上就是关于Go语言中Range关键字的全部内容,这篇文章介绍的还是很详细的,相信本文会对大家学习Go语言具有一定的参考价值,如果有疑问大家可以留言交流,小编会尽快给大家回复的,也请大家继续支持自学php网。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com