golang之range遍历

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


range是go提供的一种迭代遍历手段。

range遍历

range遍历可操作的类型有数组(包括字符串)、切片、Map、channel等:

  • index、value接收range返回值会发生一次数据拷贝;根据情况放弃接收index或value,可一定程度上提升性能;
    • slice可只遍历indexfor i := range arrays
    • map可只遍历keyfor k := range maps
    • 也可什么都不遍历,只为了循环指定次数for range collections;。
    • 遍历空(nil)不报错:循环一次也不执行;
  • 对于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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值