[英]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]
是相同的值%p
为slice
。
现在,让我们修改示例以使用我们自己的支持数组:
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.