golang range遍历是新创建对象还是创建对象的引用,通俗的讲就是range对range出来的对象的修改会不会同步到被遍历的那个数组。先看如下代码:
package main import ( "fmt" ) func main() { // int型数组测试 arr := []int{1, 2, 3, 4, 5} fmt.Println(arr) for _, d := range arr { d = 0 if d == 0 { // 忽略,防止报not used错误 } } fmt.Println(arr) // string类型数组测试 arr2 := []string{"aaaa", "aaa"} fmt.Println(arr2) for _, d := range arr2 { d = "bbbb" if d == "" { // 忽略,防止报not used错误 } } fmt.Println(arr2) // map数组测试 arr3 := []map[string]string{{"111": "111"}, {"222": "222"}} fmt.Println(arr3) for _, item := range arr3 { item["111"] = "000" item["222"] = "000" } fmt.Println(arr3) }
然后运行结果如下:
[1 2 3 4 5]
[1 2 3 4 5]
[aaaa aaa]
[aaaa aaa]
[map[111:111] map[222:222]]
[map[111:000 222:000] map[222:000 111:000]]
因此,可以得出结论,如果是基本类型的数组,range 会直接创建一个新的对象,否则range创建的是引用。