golang之range用法
range表达式迭代语法
range在go中主要是用来做迭代用的,它可以迭代:array,slice,string,map,channel。但是在迭代的过程中有些注意事项是需要牢记的,否则在实际使用过程中可能出现和你预期不符合的问题,而且很难排插到。
语法
使用 =
var x , y type
1. x := range expresstion
2. x , y := range expresstion
使用 :=
1. x :=range expresstion
2. x , y := range expresstion
range 右侧的expresstion,它可以是数组,指向数组的指针,切片,字符串,map或者是chan type <- 。当expression是chan type <- 时,则range左侧的变量只能有一个,除此之外最多只能有两个变量。当使用:=做迭代的时候,x,y变量会每次都从用,当使用=做迭代时,x,y最终的值是最后一次迭代后的变量值。
执行
当每次range执行迭代的时候,需要注意:
1. 在range迭代之前会对expresstion表达式做一次评估(评估的意思:就是对其对应的len做计算),但是有一个例外是不会执行评估的:当expresstion的len()是一个常量时并且左边变量只有一个时。
2. 当range迭代的时候,如果使用的是 := 这种方式,则:=左边的变量会在每次迭代的时候,被重复使用。
3. 当range左边只有一个变量时,且右边是slic,array,则此右边的迭代expression相当于指向原来的slice或者array,如果左边有两个变量,且右边是slic,array,则此时右边的迭代expression使用的是运来slice或者array的一个副本。
为了说明以上三个问题,请看如下代码:
func main() {
sli := []int{6, 7, 8}
for i, v := range sli {
sli = append(sli, 666)
fmt.printf("len: %v\n", len(sli))
fmt.printf("index: %v value: %v\n", i, v)
}
}
func main() {
sli := []int{6, 7, 8}
ln:=len(sli)
for i:=0;i<len(sli);i++ {
sli = append(sli, 666)
fmt.printf("len: %v\n", len(sli))
fmt.printf("index: %v value: %v\n", i, v)
}
}
上一篇: JDBC注册驱动程序3种方式