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