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(chanbool)
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)
}
}