我试图理解go中的指针,但是我仍然对它们的工作方式有些困惑。
我已经在SO上看到了另一个问题:print the Address of slice in golang,How do I print the pointer value of a Go object? What does the pointer value mean?,但仍然无法确定这个概念。
package main
import (
"fmt"
)
func main() {
numbers := myNumbers{42}
println("Pointer to numbers", &numbers)
numbers.printSlice()
numbers.printPointer()
}
type myNumbers []int
func (m myNumbers) printSlice() {
fmt.Printf("printSlice - value of m: %p \n", m)
fmt.Printf("printSlice - value of &m: %p\n", &m)
}
func (m *myNumbers) printPointer() {
fmt.Printf("printPointer - value of 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文档,第一行将打印数组第一个元素的地址,第二行将打印slice header的副本地址
在printPointer
中,第一行将打印指针的值,第二行将打印指针的地址
在main
prinln
中打印与printPointer
第一行相同的地址,这是否意味着在printPointer
中我有一个指针指向原始指针?
以上假设是否正确?
答案 0 :(得分:0)
numbers
中的 main
是一个切片,因此您可以将其视为具有三个值的结构,即对基础数组的ptr,长度和容量。当您打印&numbers
时,您正在打印此结构的地址。
printPointer
具有指针接收器,因此在printPointer
中,m
是指向main
中定义的结构的指针。这就是为什么在打印m
时获得与在main
中打印相同的值的原因。当打印&m
时,您正在打印指向指针的指针的值。 &m
是一个指向函数接收者的指针,该指针指向m
中的main
。
printSlice
获得m
的副本。因此,在打印&m
时,将打印该副本的地址。