为什么指向顶点的指针的地址在这个Golang片段中是不同的?[副本]

2eafrhcq  于 2023-09-28  发布在  Go
关注(0)|答案(2)|浏览(93)

此问题已在此处有答案

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)
}

输出量:

lmyy7pcs

lmyy7pcs1#

您正在打印指针的 * 地址 *,而不是指针。所以fmt.Println(1, &v)打印变量v的地址,如果调用v.Abs(),它将打印接收方变量(也称为v)的地址。
在这两种情况下,变量v都包含一个指向同一个Vertex对象的指针,如果您更改程序(使用%p打印地址以防止将对象指针显示为&{3, 4}),则可以看到该指针。

package main

import (
    "fmt"
    "math"
)

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {
    fmt.Printf("2 %p\n", v)
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
    v := &Vertex{3, 4}
    fmt.Printf("1 %p\n", v)
    v.Abs()
}

输出量:
Playground link

p8h8hvxi

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的值发生变化

相关问题