代码如下:
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-03-30 16:27:05 +08:00
结构体内部的指针是不会自动解引用的,如果嵌套的里面有指针类型的话,打印出来要实现 Stringer 接口的方法才行
|
7
777777 2023-03-30 17:32:51 +08:00 1
为什么你们这么喜欢用指针,还有构造函数,醒醒,你都用 go 了
|
9
Maiols 2023-03-30 22:30:46 +08:00
spew.dump
|