为什么用指针取得的值是一样的呢?

为什么使用值传入,输出的是正确的,但使用指针传入,再取值,获得的值却是一样的呢????

package main

import ( "fmt" "time" )

func tggg(p int) { fmt.Printf("p = %p, v = %d\n", p, p) }

func tggg1(t int) { fmt.Printf("v = %d\n", t) }

func main() { 
    number := []int{1, 2, 3, 4, 5}
    for _, v := range number { 
        go tggg1(v) 
        go tggg(&v) 
    }
    time.Sleep(5*time.Second)
}

输出结果:

v = 3 p = 0xc000082010, v = 5 
v = 4 p = 0xc000082010, v = 5 
v = 5 p = 0xc000082010, v = 5 
p = 0xc000082010, v = 5 v = 1 
v = 2 p = 0xc000082010, v = 5

共 1 个回复


loversmile

package main

import ( "fmt" "time" )

func tggg(p *int) { 
	fmt.Printf("p = %p, v = %d\n", p, *p) 
}

func tggg1(t int) {
	fmt.Printf("v = %d\n", t)
}

func main() {
	number := []int{1, 2, 3, 4, 5}
	for _, v := range number {
		go tggg1(v)
		go tggg(&v)
	}
	time.Sleep(5*time.Second)
}

你的代码我没编译过去,tggg应该是func tggg(p *int), 我可以解释一下你的问题,原因在于你传入的是 v 的地址,v 的地址是不变的,每一次循环只是改变了v 的所指向的内容而已,因为你用了 goroutines,tggg在执行的时候,for 循环已经结束,这个时候 v 地址所指向的值已经到循环的最后一个值5了,所以 fggg函数的打印都是 一样的。 你可以不用goroutines,这个时候你就发现v 的地址还是一样的,但是每次的值都在变。这主要是要明白地址在什么时候指向什么内容。个人见解,希望对你有帮助。

# 0