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包对结构体指针有特殊的格式化处理。

详细解释:

  1. 默认格式化行为

    • fmt包遇到结构体指针时,默认会显示&符号后跟结构体的字段值
    • 这是为了提供更友好的调试输出,直接显示结构内容而不是内存地址
  2. 获取真实内存地址: 如果需要查看实际的十六进制内存地址,可以使用%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))
}
  1. 指针解引用对比
p := &person{name: "Ann", age: 40}

fmt.Println(p)   // 输出指针的友好格式: &{Ann 40}
fmt.Println(*p)  // 输出结构体值: {Ann 40}

这种设计让开发者在调试时能快速查看结构体内容,而不需要手动解引用指针。

回到顶部