代码如下:
package main import "fmt" type MyStruct struct { Name string *Person } type Person struct { age int } func NewMyStruct(name string) *MyStruct { return &MyStruct{ Name: name, Person: &Person{ age: 18, }, } } func main() { p := NewMyStruct("小王子") fmt.Printf("p=%+v\n", p) }
我在为结构体的指针类型字段赋值时,输出后 Person 为什么是内存地址呢?
我的理解是 MyStruct 结构体中*Person 会解除指针引用取值输出 18.
![]() | 1 hahasong 2023-03-30 15:07:20 +08:00 指针类型不输出指针输出什么 |
![]() | 2 soar0712 2023-03-30 15:07:41 +08:00 也是新手,我看了下%+v 的描述说是输出数据的值,应该是 go 只对第一层结构体指针自动解对象了,内部包含的指针不会再继续解,请参考以下文章的后半部分,https://www.cnblogs.com/rxbook/p/16136202.html |
![]() | 4 zhizunzz 2023-03-30 15:09:55 +08:00 MyStruct 里面的*Person 是个类型,不是对类型的解引用 *只能解引用变量不能解引用类型 |
![]() | 5 luckyx 2023-03-30 15:56:46 +08:00 在 fmt.Printf 中使用 %+v 会打印出结构体的字段名称和值,但是它不会自动解引用指针。这就是为什么您看到的输出仍然是 Person 字段的内存地址。 为了在输出中展示 Person 结构体的内容,您可以使用自定义的 String() 方法为 MyStruct 实现 Stringer 接口。这样,当您打印 MyStruct 时,将按照您定义的 String() 方法来格式化输出。 请参考以下代码: ``` func (ms MyStruct) String() string { return fmt.Sprintf("Name:%s Person:{age:%d}", ms.Name, ms.Person.age) } ``` |
6 kalllllllen 2023-0330 16:27:05 +08:00 结构体内部的指针是不会自动解引用的,如果嵌套的里面有指针类型的话,打印出来要实现 Stringer 接口的方法才行 |
![]() | 7 777777 2023-03-30 17:32:51 +08:00 ![]() 为什么你们这么喜欢用指针,还有构造函数,醒醒,你都用 go 了 |
8 PlG5sBkXD1ziLeGB 2023-03-30 17:36:22 +08:00 via iPhone @777777 ???我直接地铁老人问号 |
![]() | 9 Maiols 2023-03-30 22:30:46 +08:00 spew.dump |