请教go语言中struct变量和struct指针的区别

go语言初学者, 在学习结构体指针的时候有些疑问, 首先定义一个结构体, 初始化结构体和它的结构体指针:

cat1 := Cat{"samy", 89.0}  

catPointer := &cat1

catPointer.weight = 222

fmt.Printf("%T \\n", cat1)

fmt.Printf("%T \\n", catPointer)

fmt.Println(cat1.weight)

cat1.weight = 111

fmt.Println(cat1.weight)

此时输出:

main.Cat 

*main.Cat

222

111

此时变量cat1catPointer类型是不同的, 这个我明白. 但是它们的区别是什么呢? 现在它们都可以对结构体的内容做出修改.

回答:

感谢两位的回答, 但是我要的答案并不是那两个.
在上述例子中, 我想知道cat1catPointer的区别, 为何他们类型不同, 却表现相同.
在go官方教程中有这样一段话:

To access the fieldXof a struct when we have the struct pointerpwe could write(*p).X. However, that notation is cumbersome, so the language permits us instead to write justp.X, without the explicit dereference.

原文链接: https://tour.golang.org/moret...

也就是说, 在go语言操作结构体时候, 用上述例子来说, 就是cat1catPointer类型是不同的, 但是在使用他们访问结构体的内存时, 会把catPointer当作(*catPointer)来操作, 那么这两个不同类型的变量就会出现表现相同, 类型不同的情况了.
下面用程序验证,下图可以看出他们两个类型确实不同:
Snipaste_2020-02-28_02-27-14.png
手动加上*之后,再次进行操作:
Snipaste_2020-02-28_02-46-23.png
答案就很明显了.
https://liqimore.com/2020/dif...

回答:

struct 赋值的时候会复制整个结构,指针赋值的时候不会复制整个结构。

回答:

和所有C家族中的语言一样,Go中的所有东西都通过值来传递。

数据指针大小 < 数量本身大小

补充: 逃逸分析, 如果可能,Go编译器会在该函数的栈帧中, 分配该函数的局部变量。然而,如果编译器不能证明在该函数返回后,该变量不再被引用, 那么编译器必须在垃圾回收的堆上分配该变量,以避免悬空指针错误。

以上是 请教go语言中struct变量和struct指针的区别 的全部内容, 来源链接: utcz.com/p/183424.html

回到顶部