golang打印切片地址
Posted
技术标签:
【中文标题】golang打印切片地址【英文标题】:Print address of slice in golang 【发布时间】:2019-02-22 03:00:02 【问题描述】:我对 golang 很陌生。在这里,我有一个问题让我困惑了一段时间。 我知道我们应该使用“&”来获取地址,但是如果我们在没有“&”的切片上使用 printf 呢?
package main
import "fmt"
var slice = []int1, 2, 3, 4
func main()
fmt.Printf("address of slice %p \n", slice)
fmt.Printf("address of slice %p \n", &slice)
结果在我的 MacBook 上是这样的:
切片地址0x11354d0
切片地址0x1128be0
提前谢谢你!
【问题讨论】:
我也不是专家,但根据我从文档中了解到的情况,我认为如果你使用%p slice
,它会打印第 0 个元素的地址(所以也许你可以做一些指针运算?!)和%p &slice
打印切片的指针,包括“包装器”或“开销”。我想你读过文档,我只是想确保golang.org/pkg/fmt
刚试过!非常感谢你:-)
“我是 golang 的新手”,所以有两个建议:该语言称为“Go”,并且始终阅读函数的完整文档,包括包级文档。总是。
谢谢你,沃尔克!
【参考方案1】:
Go 中的切片是小型的、类似结构的数据结构,指向一个实际保存切片元素的后备数组。切片头可以用reflect.SliceHeader
类型建模:
type SliceHeader struct
Data uintptr
Len int
Cap int
引用fmt
的包文档,动词%p
:
印刷:
动词:
切片:
%p address of 0th element in base 16 notation, with leading 0x
指针:
%p base 16 notation, with leading 0x The %b, %d, %o, %x and %X verbs also work with pointers, formatting the value exactly as if it were an integer.
确实,为%p
动词传递一个切片值会打印第 0 个元素的地址,这是后备数组的第 0 个元素,当您为 %p
传递 &slice
时,将打印切片头的地址(因为&slice
已经是一个指针值)。
为了验证,还要显式打印第 0 个元素的地址:
fmt.Printf("address of slice %p \n", slice)
fmt.Printf("address of slice %p \n", &slice)
fmt.Println(&slice[0])
输出将是(在Go Playground 上尝试):
address of slice 0x170460
address of slice 0x17d0b8
0x170460
如您所见,&slice[0]
与 %p
的值相同,对于 slice
。
现在让我们修改示例以使用我们自己的支持数组:
var arr = [4]int1, 2, 3, 4
var slice = arr[:]
所以这样我们也可以打印后备数组的第 0 个元素的地址:
fmt.Printf("address of slice %p \n", slice)
fmt.Printf("address of slice %p \n", &slice)
fmt.Println(&slice[0])
fmt.Printf("Array 0th: %p", &arr[0])
输出(在Go Playground上试试):
address of slice 0x170460
address of slice 0x183e78
0x170460
Array 0th: 0x170460
是的,支持数组的第 0 个元素的地址确实与切片的第 0 个元素的地址相同,这与传递给 %p
动词时为 slice
打印的值相同。
【讨论】:
非常感谢!这很清楚。然后我应该去阅读文档:-)以上是关于golang打印切片地址的主要内容,如果未能解决你的问题,请参考以下文章
Golang 切片数组打印元素两数只和等于8的下标无重复字符的最长子串