Golang 新手请教一个问题

2023-03-30 14:39:09 +08:00
 yiyu1211

代码如下:

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.

1759 次点击
所在节点    Go 编程语言
10 条回复
hahasong
2023-03-30 15:07:20 +08:00
指针类型不输出指针输出什么
soar0712
2023-03-30 15:07:41 +08:00
也是新手,我看了下%+v 的描述说是输出数据的值,应该是 go 只对第一层结构体指针自动解对象了,内部包含的指针不会再继续解,请参考以下文章的后半部分,https://www.cnblogs.com/rxbook/p/16136202.html
soar0712
2023-03-30 15:08:44 +08:00
@hahasong go 的格式化打印遇上 v 打印,如果是指针会自动解一层
zhizunzz
2023-03-30 15:09:55 +08:00
MyStruct 里面的*Person 是个类型,不是对类型的解引用 *只能解引用变量不能解引用类型
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)
}
```
kalllllllen
2023-03-30 16:27:05 +08:00
结构体内部的指针是不会自动解引用的,如果嵌套的里面有指针类型的话,打印出来要实现 Stringer 接口的方法才行
777777
2023-03-30 17:32:51 +08:00
为什么你们这么喜欢用指针,还有构造函数,醒醒,你都用 go 了
yyf1234
2023-03-30 17:36:22 +08:00
@777777 ???我直接地铁老人问号
Maiols
2023-03-30 22:30:46 +08:00
spew.dump
lysS
2023-03-31 09:22:28 +08:00
@777777 go 肯定要用指针啊,NewXxx 也不叫构造函数吧?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/928488

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX