繁体   English   中英

在golang中打印切片的地址

[英]Print address of slice in golang

我对golang很陌生。 在这里我有一个问题使我有些困惑。 我知道我们应该使用“&”来获取地址,但是如果我们在没有“&”的切片上使用printf怎么办?

package main

import "fmt"

var slice = []int{1, 2, 3, 4}

func main() {

   fmt.Printf("address of slice %p \n", slice)

   fmt.Printf("address of slice %p \n", &slice)

}

结果在我的MacBook上是这样的:

0x11354d0的地址

切片0x1128be0的地址

先感谢您!

Go中的切片是小型的,类似于结构的数据结构,指向实际上包含切片元素的支持数组。 可以使用类型reflect.SliceHeader对切​​片标头进行建模:

type SliceHeader struct {
        Data uintptr
        Len  int
        Cap  int
}

引用fmt doc文档,动词%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动词传递一个slice值会打印出第0个元素的地址,该元素是后备数组的第0个元素,并且当为%p传递&slice ,它将打印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]是相同的值%pslice

现在,让我们修改示例以使用我们自己的支持数组:

var arr = [4]int{1, 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个元素的地址确实与slice的第0个元素的地址相同,这是传递给%p动词时为slice打印的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM