Skip to content

Latest commit

 

History

History
121 lines (94 loc) · 1.86 KB

for_assign.md

File metadata and controls

121 lines (94 loc) · 1.86 KB

循环赋值错误

错误的做法

package main

import "fmt"

func main() {
	number := make([]int, 5)

	for i, v := range number {
		v = i
		fmt.Printf(" %v", v)
	}

	fmt.Println("\n", number)
}
// $ go run main.go
// 输出如下 
/**
     0 1 2 3 4
    [0 0 0 0 0]
*/

错误的原因在于: 循环时的 v 变量是从当前元素复制出来的一个临时变量,修改它的值并不会影响到当前元素的值。

正确的做法

package main

import "fmt"

func main() {
	number := make([]int, 5)

	for i, _ := range number {
		number[i] = i
		fmt.Printf(" %v", number[i])
	}

	fmt.Println("\n", number)
}
// $ go run main.go
// 输出如下 
/**
    0 1 2 3 4
    [0 1 2 3 4]
*/

循环引用错误

错误的做法

package main

import (
	"fmt"
)

func main() {
	numbers := make([]*int, 5)
	for i, _ := range numbers {
		numbers[i] = &i
		fmt.Printf("%v ", *(numbers[i]))
	}
	fmt.Println()

	for i, _ := range numbers {
		fmt.Printf("%v ", *(numbers[i]))
	}
	fmt.Println()
}
// $ go run main.go
// 输出如下 
/**
    0 1 2 3 4
    4 4 4 4 4
*/

错误的原因在于: 每次循环时的 i 都是同一个变量,将它的地址赋值给当前元素,循环结束后,所有元素指向的都是 i 的地址, 也就是说,所有的元素指向的地址对应的值都是 i 最后一次修改后的值,也就是 4

正确的做法

package main

import (
	"fmt"
)

func main() {
	numbers := make([]*int, 5)
	for i, _ := range numbers {
		cur := i          // 复制当前值,保证每次赋值给当前元素的变量不一样
		numbers[i] = &cur // 获取复制后的值的地址
		fmt.Printf("%v ", *(numbers[i]))
	}
	fmt.Println()

	for i, _ := range numbers {
		fmt.Printf("%v ", *(numbers[i]))
	}
	fmt.Println()
}
// $ go run main.go
// 输出如下 
/**
    0 1 2 3 4
    0 1 2 3 4
*/