切片指针的内存值是什么意思?

我试图理解go中的指针,但是我仍然对它们的工作方式有些困惑。

我已经在SO上看到了另一个问题:print the Address of slice in golangHow 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中我有一个指针指向原始指针?

以上假设是否正确?

sw706 回答:切片指针的内存值是什么意思?

numbers中的

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

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

printSlice获得m的副本。因此,在打印&m时,将打印该副本的地址。

本文链接:https://www.f2er.com/3127816.html

大家都在问