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的下标无重复字符的最长子串

golang-101-hacks(12)——切片作为函数参数传递

Golang按名称排序切片[关闭]

golang中数组与切片的区别

Golang:切片的声明初始化以及操作示例,详解概括

Golang:切片的声明初始化以及操作示例,详解概括