前言
indexvalueindex
比如像这样的用法:
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
for
4、最后,分别输出list与list2中的每个元素
从代码来看,理所当然,我们期望得到的结果应该是这样:
{A} {B} {C}
&{A} &{B} &{C}
但是结果却出乎意料,程序的输出是这样的:
{A} {B} {C}
&{C} &{C} &{C}
for…range
for…rangefor…rangevaluevaluelistfor…rangevaluevaluevalue{c}&{c}
for…range
var value Foo
for var i := 0; i < len(list); i++ {
value = list[i]
list2[i] = &value
}
&{C} &{C} &{C}
indexfor…range
for i, _ := range list {
list2[i] = &list[i]
}
(&{A} &{B} &{C})
实验代码如下:
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…range
而正确的做法是:
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语言具有一定的参考价值,如果有疑问大家可以留言交流,小编会尽快给大家回复的,也请大家继续支持脚本之家。
您可能感兴趣的文章: