goloang range理解


1、range 支持的类型
2、range 的特性


1、range 支持的类型
类型备注
array数组,也可以是指向数组的指针
string字符串
slice切片
map字典
channel允许接收数据的通道,通道有只写、只读、读写通道
var a = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
acopy := &a

// 迭代一个数组
for i, v := range a {
}

// 迭代一个指向数组的指针
for i, v := range acopy {
}

// 迭代一个字符串
aStr := "abcdef"
for i, v := range aStr {
    fmt.Println(i, " = ", v)
}

// 迭代一个map
m := make(map[string]int)
for k, v := range m {
}

// 迭代一个channel
channel := make(chan bool)
for v, ok := range channel {
}
2、range 的特性
  • range 右边的表达式在循环开始之前只计算一次,但是有一个意外,range数组时,若只取数组的下标,那么实际上计算的不是数组本身,而是len(array),这意味着很可能在编译阶段就用了一个常量来代替了len(a),也就是说在编译阶段完成了
var a = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

// 循环开始前对数组a计算一次
for i, v := range a {
    fmt.Println(i, " = ", v)
}

// 这里计算的不是数组a,而是len(a),
// 可能在编译阶段就已经完成
for i, _ := range a {
    fmt.Println(i, " = ", v)
}
  • range 左边变量若以端变量,那么将会重用变量,每一次迭代地址都一样,只是一个值的拷贝
type Student struct {
    Name string
    Age  int
}

func paseStudent() {
    m := make(map[string]*student)
    students := []Student{
        {Name: "Lucy", Age: 24},
        {Name: "Lily", Age: 23},
        {Name: "Jam",  Age: 22},
    }

    /*
     * 循环之前计算一次 students
     * student 是短变量,第一次定义后后续复用它
     */
    for _, student := range students {
        /*
         * 取 stu的地址,实际就是第一次迭代是定义的stu的地址,
         * 迭代完之后 &stu 这个地址处存储的是stus的最后一个元素
         * 的值,最后再去遍历以后发现m存储的值都是最后一个
         */
        m[student.Name] = &stu
        fmt.Printf("%p\n", &stu)
    }

}
  • 对map迭代过程中可以删除和添加元素,添加的值可能会在loop中看到也可能看不到
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值