for range 在go语言中用于遍历一个可迭代的对象,它可以应用于数组,切片,字典等
它有以下一些用法
遍历数组与切片
| package main
import "fmt"
func main() {
a := [...]string{"a", "b", "c", "d"}
for i := range a {
fmt.Println("Array item", i, "is", a[i])
}
}
|
初始化数组时使用[...]string
为初始化一个字符串数组,长度自动计算,如果写成[]string
则为初始化一个切片.
for i := range a
这里是通过遍历数组的下标,i 每次循环下标加1,然后通过 array[i]
的方式获取数组的值,也可以在for range 结构中直接获取数组元素
| package main
import "fmt"
func main() {
a := [...]string{"a", "b", "c", "d"}
for i,v := range a {
fmt.Println("Array item", i, "is", v)
}
}
|
遍历map
遍历字典也有两种方式,一种是遍历key,一种是同时遍历key和value
| package main
import "fmt"
func main() {
var fruits = map[string]int {
"apple": 2,
"banana": 5,
"orange": 8,
}
for f,s := range fruits{
fmt.Println("fruits:",f,"score:",s)
}
for f := range fruits{
fmt.Println("fruits:",f,"score:",fruits[f])
}
}
|
遍历通道
可以使用for range 来遍历通道,当通道未关闭时,会阻塞的等待,当通道关闭以后,则跳出循环遍历。
| package main
import "fmt"
func main() {
ch := make(chan int,6)
go setData(ch)
for ele := range ch{
fmt.Println("get data " ,ele)
}
}
func setData(ch chan int) {
for v:=0;v<8;v++{
ch <- v
}
close(ch)
}
|
如果上面代码中,setData函数中不close(ch) 关闭通道的话,则会发生panic 死锁
上面的for range 遍历通道,如果使用for 循环来写的话是下面这样
| package main
import "fmt"
func main() {
ch := make(chan int,6)
go setData(ch)
for{
v,ok := <- ch
if !ok{
break
}
fmt.Println("get data ",v)
}
}
func setData(ch chan int) {
for v:=0;v<8;v++{
ch <- v
}
close(ch)
}
|