基本用法
下述两个函数test1与test2运行结果有何区别?
func test1() {
intArray := []int{
1, 2, 3, 4}
for _, val := range intArray {
val++
}
// 仍然为[1, 2, 3, 4]
fmt.Println(intArray)
}
func test2() {
intArray := []int{
1, 2, 3, 4}
for i := 0; i < len(intArray); i++ {
intArray[i]++
}
// 改变为[2, 3, 4, 5]
fmt.Println(intArray)
}
原理是这样的,对于for i, val := range(intArray)
来说,val是intArray[i]的副本,对val的改变不会导致intArray内元素的改变。
另一方面,i和val在循环内都是同一个变量,只在循环头声明一次,即两者的地址不变。这是另一个易错的地方。下述两个函数test3与test4运行结果有何区别?
package main
import "fmt"
func test3() {
slice := []int{
0, 1, 2, 3}
myMap := make(map[int]*int)
for index , value := range slice {
myMap[index] = &value
}
// map[0]=3, map[1]=3, map[2]=3, map[3]=3
prtMap(myMap)
}
func<