Golang Range

Golang的range可以用来遍历array,slice,string,map或channel


range array:

func main() {
	animals := [3]string{}
	animals[0] = "tiger"
	animals[1] = "cat"
	animals[2] = "lion"
	for index, animal := range animals {
		fmt.Println(index, animal)
	}
}

//output:
//0 tiger
//1 cat
//2 lion

range slice:

func main() {
	urls := []string{"ziyaun.work", "https://ziyuan.work"}
	for index, url := range urls {
		fmt.Println(index, url)
	}
}

//output:
//0 ziyaun.work
//1 https://ziyuan.work

range string:

func main() {
	url := "ziyuan.work"
	for i, v := range url {
		fmt.Println(i, v)
	}
}

//output:
//0 122
//1 105
//2 121
//3 117
//4 97
//5 110
//6 46
//7 119
//8 111
//9 114
//10 107

range map:

func main() {
	userList := make(map[string]string)
	userList["url"] = "ziyuan.work"
	for key, value := range userList {
		value = "I change myself" //改变的只是提取item的值,userlist不受影响
		fmt.Println(userList[key])
		fmt.Println(value)
	}
}

// output:
//ziyuan.work
//I change myself

range channel:

func main() {
	wg := sync.WaitGroup{}
	wg.Add(1)

	c := make(chan int)
	go func() {
		defer wg.Done()
		for i := 0; i < 10; i++ {
			c <- i
		}
	}()

	go func() {
		wg.Wait()
		close(c)
	}() // 当使用range对channel操作时,会无限遍历,最终变成死锁,因此需要关闭channel

	for value := range c {
		log.Println(value)
	}
}

//output:
//0
//1
//2
//3
//4
//5
//6
//7
//8
//9