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 回复
引用 jameswang2015:
我的理解是始终使用
fmt.Printf + %p来打印指针,对吗?
是的。
哇,你是作者啊!感谢如此详细而生动的回复!
所以,我的理解是应该始终使用 fmt.Printf + %p 来打印指针,对吗?
func main() {
fmt.Println("hello world")
}
在Go语言中,fmt.Println 对不同类型的指针有不同的格式化行为,这源于 fmt 包中针对不同内置类型实现的 Stringer 接口或格式化规则。
1. 基本类型指针的打印
- 当使用
fmt.Println打印基本类型(如int、string、bool)的指针时,默认会输出十六进制内存地址。 - 这是因为基本类型没有实现自定义的
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.Stringer或fmt.Formatter接口,直接返回地址。- 对于切片、结构体等,
fmt包选择显示&后跟值内容,因为它们的内部结构更复杂,直接显示地址对调试帮助有限。 %p是专门用于打印任何类型指针地址的格式化动词,保证一致性。
这种设计在调试时很有用:基本类型指针直接看地址,复合类型指针能快速查看内容,而 %p 在需要确切地址时统一使用。

