此问题已在此处有答案:
Go Pointers pointing to different memory locations but updating same variable [closed](3个答案)
9天前关闭
为什么我在下面的程序中得到两个不同的地址?即使我们使用指针,Golang也会将数据从一个位置复制到另一个位置吗?
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
fmt.Println(2, &v)
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := &Vertex{3, 4}
fmt.Println(1, &v)
}
输出量:
2条答案
按热度按时间lmyy7pcs1#
您正在打印指针的 * 地址 *,而不是指针。所以
fmt.Println(1, &v)
打印变量v
的地址,如果调用v.Abs()
,它将打印接收方变量(也称为v
)的地址。在这两种情况下,变量
v
都包含一个指向同一个Vertex
对象的指针,如果您更改程序(使用%p
打印地址以防止将对象指针显示为&{3, 4}
),则可以看到该指针。输出量:
Playground link
p8h8hvxi2#
您正在见证不同的地址,因为在Golang中,所有内容都通过值传递给函数-https://go.dev/doc/faq#pass_by_value
所以Golang在传递给
Abs()
func时创建了同一个指针变量v
的新副本(它本身存储指向实际值的指针),这在上面的答案中很明显。例如,#123 -> {3,4}
v = #345 -> #123
v1 = #567 -> #123 -副本传递给
Abs()
由于
Abs()
具有指针接收器,因此对v
的任何修改都会导致#123的值发生变化