range是go提供的一种迭代遍历手段。
range遍历
range遍历可操作的类型有数组(包括字符串)、切片、Map、channel等:
- index、value接收range返回值会发生一次数据拷贝;根据情况放弃接收index或value,可一定程度上提升性能;
- slice可只遍历index:
for i := range arrays; - map可只遍历key:
for k := range maps; - 也可什么都不遍历,只为了循环指定次数:
for range collections;。 - 遍历空(nil)不报错:循环一次也不执行;
- slice可只遍历index:
- 对于channel,没有数据时,会被阻塞;
- 尽量避免遍历过程中修改原数据;
func rangeIndexOnly() {
v := []int{10, 20, 30}
for i := range v {
v[i] *= 2
}
fmt.Println(v)
}
func rangeKeyOnly() {
fruits := map[string]string{"a": "apple", "b": "banana"}
for k := range fruits {
fmt.Printf("%s\n", k)
}
}
func rangeOnly() {
var Counts [5][0]int // no memory occupy
for range Counts { // 五次循环
fmt.Println("Range-Count")
}
}
因元素[0]int大小是0,所以Counts占用内存大小也为0。
遍历slice
遍历slice前,会先获取其长度作为循环次数;循环体中,每次循环会先获取元素值,若需要index与value的话,则进行赋值;
遍历切片的伪码:
// for_temp := range-slice
// len_temp := len(for_temp)
// for index_temp = 0; index_temp < len_temp; index_temp++ {
// value_temp = for_temp[index_temp]
// index = index_temp
// value = value_temp
// original

本文介绍Go语言中使用range关键字遍历数组、切片、Map和channel的方法与注意事项,包括如何只遍历索引或键值,如何避免遍历过程中修改原数据等问题。
最低0.47元/天 解锁文章
595

被折叠的 条评论
为什么被折叠?



