gpt4 book ai didi

go - 函数中对结构的指针和引用

转载 作者:IT王子 更新时间:2023-10-29 01:56:30 25 4
gpt4 key购买 nike

我刚开始使用 Go,我很难理解函数内部结构的指针和引用。

考虑示例 https://play.golang.org/p/zd8La4ecNXw

package main

import "fmt"

type User struct {
Name string
}

func main() {
// 1st
u := User{Name: "Anne"}
fmt.Println("1st: ", &u.Name)
fmt.Println("1st: ", u.Name)
Modify1(u)
fmt.Println("1st: ", u.Name)

// 2nd
fmt.Println()
v := &User{Name: "Anne"}
fmt.Println("2nd: ", &v.Name)
fmt.Println("2nd: ", v.Name)
Modify2(v)
fmt.Println("2nd: ", v.Name)

// 3rd
fmt.Println()
y := &User{Name: "Anne"}
fmt.Println("3rd: ", &y.Name)
fmt.Println("3rd: ", y.Name)
Modify3(&y)
fmt.Println("3rd: ", y.Name)

// 4th
fmt.Println()
z := &User{Name: "Anne"}
fmt.Println("4th: ", &z.Name)
fmt.Println("4th: ", z.Name)
Modify4(z)
fmt.Println("4th: ", z.Name)
}

func Modify1(u User) {
fmt.Println("func: ", &u.Name)
u.Name = "Duncan"
fmt.Println("func: ", u.Name)
}

func Modify2(v *User) {
fmt.Println("func: ", &v.Name)
v = &User{Name: "Paul"}
fmt.Println("func: ", v.Name)
}

func Modify3(y **User) {
fmt.Println("func: ", &y)
fmt.Println("func: ", &(*y).Name)
*y = &User{Name: "Bob"}
fmt.Println("func: ", (*y).Name)
}

func Modify4(z *User) {
fmt.Println("func: ", &z.Name)
z.Name = "John"
fmt.Println("func: ", z.Name)
}

结果:

1st:  0x40e128
1st: Anne
func: 0x40e140
func: Duncan
1st: Anne

2nd: 0x40e158
2nd: Anne
func: 0x40e158
func: Paul
2nd: Anne

3rd: 0x40e188
3rd: Anne
func: 0x40e198
func: 0x40e188
func: Bob
3rd: Bob

4th: 0x40e1b8
4th: Anne
func: 0x40e1b8
func: John
4th: John

除了第一个示例,我没有问题,所有其他示例似乎都指向原始结构赋值,但第二个 没有更改调用者值。

为什么会这样,为什么这与 3rd4 不同?

最佳答案

要记住的关键是一切都是按值传递(也就是通过复制传递)。当您将指针传递给函数时,该参数是该函数中的局部变量,包含指针的副本。该本地副本指向调用者引用的同一内存。

当你这样做时:

v = &User{Name: "Paul"}

你正在覆盖你的局部变量 v 一个new指针指向一个new实例>用户。它现在指向与调用者指针不同的内存,因此调用者什么也看不到。

如果您改为这样做:

*v = User{Name: "Paul"}

然后 same 指针,指向 same 内存,将被 User实例覆盖>.

同样,在 Modify3 中,您有一个指向指针的指针。所以你的调用者和函数都有一个局部变量,它指向一个内存位置,这个内存位置包含另一个内存位置,可以在其中找到实际值。请注意,这在 Go 中是一种非常不寻常(但并非闻所未闻)的模式,但在其他语言中很常见。当您这样做时:

*y = &User{Name: "Bob"}

您正在创建一个指向新 User 的新指针,并将该新指针存储在外部指针指向的共享内存中。因此,函数和调用者再次共享内存,并且都将看到更改。

关于go - 函数中对结构的指针和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54463280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com