Pointers 切片指针的内存值意味着什么?

Pointers 切片指针的内存值意味着什么?,pointers,go,Pointers,Go,我试图理解围棋中的指针,但我仍然有点困惑,它们是如何工作的 我已经考虑过其他的问题了,所以:,但我还是不能把我的思想集中在这个概念上 主程序包 进口( “fmt” ) func main(){ 数字:=myNumbers{42} println(“指向数字的指针”、&数字) numbers.printSlice() numbers.printPointer() } 键入myNumbers[]int func(m myNumbers)printSlice(){ fmt.Printf(“printS

我试图理解围棋中的指针,但我仍然有点困惑,它们是如何工作的

我已经考虑过其他的问题了,所以:,但我还是不能把我的思想集中在这个概念上

主程序包
进口(
“fmt”
)
func main(){
数字:=myNumbers{42}
println(“指向数字的指针”、&数字)
numbers.printSlice()
numbers.printPointer()
}
键入myNumbers[]int
func(m myNumbers)printSlice(){
fmt.Printf(“printSlice-m的值:%p\n”,m)
fmt.Printf(“printSlice-value of&m:%p\n”,&m)
}
func(m*myNumbers)printPointer(){
fmt.Printf(“打印指针-m的值:%p\n”,m)
fmt.Printf(“printPointer-value of&m:%p\n”,&m)
}
输出为:

Pointer to numbers 0xc42000a060
printSlice - value of m:  0xc420016100 
printSlice - value of &m: 0xc42000a080
printPointer - value of m:  0xc42000a060
printPointer - value of &m:  0xc42000c030
根据
printSlice
中的go文档,第一行将打印数组第一个元素的地址,第二行将打印切片头副本的地址

printPointer
中,第一行将打印指针的值,第二行将打印指针的地址

main
prinln
中,打印与
printPointer
的第一行相同的地址,那么这是否意味着在
printPointer
中,我有一个指向原始指针的指针


上述假设是否正确?

numbers
main
中是一个切片,因此您可以将其视为具有三个值的结构,即ptr到底层数组、长度和容量。当您打印
&数字时,您正在打印此结构的地址

printPointer
有一个指针接收器,因此在
printPointer
中,
m
是指向
main
中定义的结构的指针。这就是为什么当您打印
m
时,您会得到与在
main
中打印的值相同的值。打印
&m
时,您正在打印指向指针的指针值
&m
是指向函数接收器的指针,它指向
main
中的
m


printSlice
获取
m
的副本。因此,当您打印
&m
时,您将打印该副本的地址。

调用printPointer方法,并将
数字的地址作为接收方参数。main中的print语句和printPointer中的第一个print语句打印相同的值。