Golang Go语言新手请教一个问题

发布于 1周前 作者 yuanlaile 来自 Go语言

代码如下:

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.


Golang Go语言新手请教一个问题

更多关于Golang Go语言新手请教一个问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

11 回复

指针类型不输出指针输出什么

更多关于Golang Go语言新手请教一个问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


也是新手,我看了下%+v 的描述说是输出数据的值,应该是 go 只对第一层结构体指针自动解对象了,内部包含的指针不会再继续解,请参考以下文章的后半部分,https://www.cnblogs.com/rxbook/p/16136202.html

go 的格式化打印遇上 v 打印,如果是指针会自动解一层

MyStruct 里面的*Person 是个类型,不是对类型的解引用 *只能解引用变量不能解引用类型

在 fmt.Printf 中使用 %+v 会打印出结构体的字段名称和值,但是它不会自动解引用指针。这就是为什么您看到的输出仍然是 Person 字段的内存地址。

为了在输出中展示 Person 结构体的内容,您可以使用自定义的 String() 方法为 MyStruct 实现 Stringer 接口。这样,当您打印 MyStruct 时,将按照您定义的 String() 方法来格式化输出。

请参考以下代码:

<br>func (ms MyStruct) String() string {<br> return fmt.Sprintf("Name:%s Person:{age:%d}", <a target="_blank" href="http://ms.Name" rel="nofollow noopener">ms.Name</a>, ms.Person.age)<br>}<br>

结构体内部的指针是不会自动解引用的,如果嵌套的里面有指针类型的话,打印出来要实现 Stringer 接口的方法才行

为什么你们这么喜欢用指针,还有构造函数,醒醒,你都用 go 了

???我直接地铁老人问号

go 肯定要用指针啊,NewXxx 也不叫构造函数吧?

你好,很高兴看到你对Go语言感兴趣!作为IT营中专注于Go语言的专家,我很乐意解答你的问题。

对于新手来说,Go语言确实是一个值得学习的强大工具。它以其简洁、高效和并发处理能力而著称,非常适合构建高性能的网络服务和系统工具。

首先,我建议你从Go语言的官方文档和教程入手。这些资源提供了对语言特性的全面介绍,包括基础语法、数据类型、函数、控制结构等。通过阅读这些文档,你可以快速建立起对Go语言的基本认识。

接下来,你可以尝试编写一些简单的程序来实践所学内容。例如,编写一个计算斐波那契数列的程序,或者实现一个基本的HTTP服务器。这些实践项目不仅能帮助你巩固知识,还能让你对Go语言的并发处理能力有更直观的感受。

此外,参与Go语言的社区活动也是一个很好的学习方式。你可以加入相关的论坛、社交媒体群组或开源项目,与其他开发者交流心得、分享经验。这些社区资源不仅能为你提供技术支持,还能让你了解到Go语言的最新动态和发展趋势。

最后,记得保持耐心和持续学习的态度。Go语言虽然简洁,但也有一些复杂的特性和最佳实践需要时间去掌握。只要你不断实践、不断总结,相信你一定能够成为Go语言方面的专家。祝你学习愉快!

回到顶部