Golang中如何打印整数切片的指针

Golang中如何打印整数切片的指针 我注意到当打印指向基本类型(如整数)的指针时,它会输出该整数的十六进制内存地址。但对于指向切片/结构体等复杂结构的指针,它会打印 &slice,我必须使用 fmt.Printf("%p", pointer) 才能打印地址。那么指向基本类型的指针和指向切片/结构体的指针在打印时有什么区别呢?以下是代码示例:

package main

import "fmt"

func main() {
	a := 1
	pa := &a

	b := []int{1, 2, 3}
	pb := &b

	fmt.Println(a, "\t", pa, "\n")
	fmt.Println(b, "\t", pb, "\n")
	fmt.Printf("%p\n", pb)
}

输出结果如下:

1        0xc000096000 

[1 2 3]          &[1 2 3] 

0xc000098000

谢谢


更多关于Golang中如何打印整数切片的指针的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

“标记为已解决”?

更多关于Golang中如何打印整数切片的指针的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


引用 jameswang2015:

我的理解是始终使用 fmt.Printf + %p 来打印指针,对吗?

是的。

哇,你是作者啊!感谢如此详细而生动的回复!

所以,我的理解是应该始终使用 fmt.Printf + %p 来打印指针,对吗?

func main() {
    fmt.Println("hello world")
}

在Go语言中,fmt.Println 对不同类型的指针有不同的格式化行为,这源于 fmt 包中针对不同内置类型实现的 Stringer 接口或格式化规则。

1. 基本类型指针的打印

  • 当使用 fmt.Println 打印基本类型(如 intstringbool)的指针时,默认会输出十六进制内存地址。
  • 这是因为基本类型没有实现自定义的 String() 方法,fmt 包直接使用指针的地址表示。

2. 切片和结构体指针的打印

  • 切片、数组、结构体等复合类型在 fmt.Println 中打印指针时,会显示 & 后跟该值的默认格式(即解引用后的内容)。
  • 这种行为是因为 fmt 包对这些类型实现了特殊的格式化逻辑,旨在提供更直观的数据预览,而非直接显示内存地址。
  • 要获取实际内存地址,必须使用 fmt.Printf 配合 %p 动词。

示例代码演示区别:

package main

import "fmt"

type MyStruct struct {
    Field int
}

func main() {
    // 基本类型指针
    num := 42
    pNum := &num
    fmt.Println("基本类型指针:", pNum) // 输出如: 0xc000096000

    // 切片指针
    slice := []int{1, 2, 3}
    pSlice := &slice
    fmt.Println("切片指针:", pSlice)   // 输出: &[1 2 3]
    fmt.Printf("切片地址: %p\n", pSlice) // 输出如: 0xc000098000

    // 结构体指针
    s := MyStruct{Field: 100}
    pStruct := &s
    fmt.Println("结构体指针:", pStruct)   // 输出: &{100}
    fmt.Printf("结构体地址: %p\n", pStruct) // 输出如: 0xc00009e000

    // 自定义类型的指针
    type MyInt int
    myInt := MyInt(5)
    pMyInt := &myInt
    fmt.Println("自定义类型指针:", pMyInt) // 输出如: 0xc000096008
}

输出示例:

基本类型指针: 0xc000096000
切片指针: &[1 2 3]
切片地址: 0xc000098000
结构体指针: &{100}
结构体地址: 0xc00009e000
自定义类型指针: 0xc000096008

根本原因:

  • fmt 包对 int 等基本类型的指针实现了 fmt.Stringerfmt.Formatter 接口,直接返回地址。
  • 对于切片、结构体等,fmt 包选择显示 & 后跟值内容,因为它们的内部结构更复杂,直接显示地址对调试帮助有限。
  • %p 是专门用于打印任何类型指针地址的格式化动词,保证一致性。

这种设计在调试时很有用:基本类型指针直接看地址,复合类型指针能快速查看内容,而 %p 在需要确切地址时统一使用。

回到顶部