Golang中结构体地址的获取与使用
Golang中结构体地址的获取与使用
fmt.Println(&person{name: "Ann", age: 40})
为什么这会返回"&{Ann,40}"而不是十六进制的地址?
3 回复
使用 Printf
fmt.Printf("%p\n", &person{name: "Ann", age: 40})
更多关于Golang中结构体地址的获取与使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
fmt.Println 不会返回任何内容。但它会产生将内容写入标准输出的副作用。
根据文档说明,Println 等同于对每个参数应用 %v 格式,用空格分隔它们并以换行符结尾。
%v 以默认格式打印,对于结构体(除非它们实现了 fmt.Stringer)来说,就是简单地在大括号中打印字段值。引用类型会在前面加上 & 符号。
要实际查看地址,请按照建议的方法操作。
在Go语言中,当你使用fmt.Println(&person{name: "Ann", age: 40})时,输出&{Ann 40}而不是十六进制地址,这是因为fmt包对结构体指针有特殊的格式化处理。
详细解释:
-
默认格式化行为:
- 当
fmt包遇到结构体指针时,默认会显示&符号后跟结构体的字段值 - 这是为了提供更友好的调试输出,直接显示结构内容而不是内存地址
- 当
-
获取真实内存地址: 如果需要查看实际的十六进制内存地址,可以使用
%p格式化动词:
package main
import "fmt"
type person struct {
name string
age int
}
func main() {
p := &person{name: "Ann", age: 40}
// 默认输出(友好格式)
fmt.Println(p) // 输出: &{Ann 40}
// 获取真实内存地址
fmt.Printf("%p\n", p) // 输出类似: 0xc00000c030
// 或者使用Println配合格式化
fmt.Println(fmt.Sprintf("%p", p))
}
- 指针解引用对比:
p := &person{name: "Ann", age: 40}
fmt.Println(p) // 输出指针的友好格式: &{Ann 40}
fmt.Println(*p) // 输出结构体值: {Ann 40}
这种设计让开发者在调试时能快速查看结构体内容,而不需要手动解引用指针。

