go中用解引用指针可直接获取其指向的值(如int得int),但nil指针解引用会panic,故需先判空;fmt.println(p)仅输出地址,应写fmt.println(*p)查看实际内容。

用 * 解引用指针就能看到值
Go 里没有类似 C 的 printf("%d", *p) 那种显式“查看内存”机制,想看指针指向的内容,唯一可靠方式就是解引用。只要指针非 nil,*p 就直接给出它指向的值——不是地址,是那个值本身的副本。
- 对
*int解引用得到一个int;对*string得到一个string;对结构体指针*User得到一个User值(注意:是拷贝) - 如果指针是 nil,
*p会 panic:invalid memory address or nil pointer dereference,所以打印前最好先判空 -
fmt.Printf("%v", p)打印的是地址(如0xc000010230),而fmt.Printf("%v", *p)才是你关心的数据内容
调试时别只依赖 fmt.Println(p)
新手常误以为 fmt.Println(p) 能“看到内容”,其实它默认调用指针的 String() 方法(若实现)或直接输出地址。多数情况下你看到的是一串十六进制地址,毫无业务意义。
- 正确做法是显式写
fmt.Println(*p)或fmt.Printf("value: %+v\n", *p) - 如果指针指向结构体且字段多,用
%+v可显示字段名,比%v更清晰 - 对切片、map、channel 等引用类型,即使是指针,
*p解引用后仍是其本身(因为它们底层已是引用),这点容易混淆,但行为一致
vscode/dlv 调试时怎么看指针值
在 VS Code 启动 dlv 调试时,变量面板里 hover 指针变量,默认显示的是地址。要看到实际内容,得点开小箭头展开,或者在“调试控制台”中手动输入表达式。
- 在调试控制台输入
*p(回车),会立即求值并显示结果 - 若 p 是 nil,控制台报错
read memory at address 0x0: invalid argument to operation,此时就知道不能解引用 - dlv 命令行下可用
print *p或简写p *p,效果相同 - 注意:dlv 不支持像 gdb 那样用
x/4d &i查原始内存字节,Go 的内存模型不鼓励这种操作
小心结构体指针解引用的拷贝开销
对大结构体(比如含几 MB 字段的 struct)做 *p 解引用,会触发一次完整拷贝。这不一定导致 bug,但可能拖慢日志或调试输出。
- 如果只是想检查某个字段,直接写
p.FieldA即可,无需先解引用整个结构体 - 日志中避免写
log.Printf("user: %+v", *userPtr),改用log.Printf("user.ID=%d, user.Name=%q", userPtr.ID, userPtr.Name) - 用
reflect.ValueOf(p).Elem().Interface()也能拿到值,但反射更重,纯属绕路,没必要
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











