Golang中访问结构字段时,结构字面量和指针的区别

5

我不理解在访问结构体字段时,结构体字面量和结构体指针之间的区别。它们在内部行为上是否有所不同?

type Person struct {
    Name string
}

p := &Person{Name: "Alice"}
u := Person{Name: "Bob"}

fmt.Println(p.Name)  // any difference ?
fmt.Println(u.Name)  // any difference ?

我搜索过这个问题,但是找到的文章都解释了值和指针之间的区别,或者是关于把值传递给方法与把指针传递给方法之间的差异。这些并不是我想知道的。

1个回答

11

u是一个Person类型的变量。 p是指向Person类型的指针变量,它被初始化为一个匿名(“临时”)对象的地址。表达式p.Name使用了指针的自动解引用,等同于(*p).Namep指向的对象存在的时间与p指向它的时间相同,以后可能会被Go的非确定性内存管理器销毁。

无论是p.Name还是u.Name,都是string类型的表达式,并且在调用中没有“通过指针传递”,因为它们的地址没有被取出。在fmt.Println的情况下,该值实际上是通过Go的结构子类型形式的特殊多态性“通过接口”传递的。


是的!“指针的自动解引用”正是我想要搜索但不知道的关键词。你的回答非常有帮助且清晰明了。谢谢。 - kuang
1
对于不太熟悉Go语言和指针/引用的人来说,能否用通俗易懂的语言解释一下?这有什么实际影响吗? - Jordan Feldstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接