欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

golang之range用法

程序员文章站 2022-07-02 12:46:31
range表达式迭代语法 range在go中主要是用来做迭代用的,它可以迭代:array,slice,string,map,channel。但是在迭代的过程中有些注意事项是需要牢记的,否则在实际使用过程中可能出现和你预期不符合的问题,而且很难排插到。 语法 使用 = var x , y Type 1 ......

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)
	}
}  
上面这段代码不会无限的执行下去,只会执行三次迭代就会退出,因为在迭代前len(sli)是常量3,所有在循环体执行迭代向sli中添加666时,在次执行迭代,不会从新对sli做评估。此时对代码和以下代码时等价的:
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)
	}
}