【问题标题】:How to print the memory address of a slice in Golang?如何在 Golang 中打印 slice 的内存地址?
【发布时间】:2014-05-13 17:13:32
【问题描述】:

我有一些 C 方面的经验,我对 golang 完全陌生。

func learnArraySlice() {
  intarr := [5]int{12, 34, 55, 66, 43}
  slice := intarr[:]
  fmt.Printf("the len is %d and cap is %d \n", len(slice), cap(slice))
  fmt.Printf("address of slice 0x%x add of Arr 0x%x \n", &slice, &intarr)
}

现在在 golang 中 slice 是数组的引用,其中包含指向 slice 数组 len 和 slice 上限的指针,但是该 slice 也将在内存中分配,我想打印该内存的地址。但做不到。

【问题讨论】:

    标签: go slice memory-address


    【解决方案1】:

    http://golang.org/pkg/fmt/

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

    %p 将打印地址。

    【讨论】:

      【解决方案2】:

      切片及其元素是可寻址的:

      s := make([]int, 10)
      fmt.Printf("Addr of first element: %p\n", &s[0])
      fmt.Printf("Addr of slice itself:  %p\n", &s)
      

      【讨论】:

      • 我还没有真正研究过源代码,但fmt.Printf("Addr of first element: %p\n", s) 也可以。这是有道理的,当您考虑 fmt.Printf("%v", s) 打印底层数组的元素时。
      【解决方案3】:

      对于切片底层数组和数组的地址(在你的例子中是一样的),

      package main
      
      import "fmt"
      
      func main() {
          intarr := [5]int{12, 34, 55, 66, 43}
          slice := intarr[:]
          fmt.Printf("the len is %d and cap is %d \n", len(slice), cap(slice))
          fmt.Printf("address of slice %p add of Arr %p\n", &slice[0], &intarr)
      }
      

      输出:

      the len is 5 and cap is 5 
      address of slice 0x1052f2c0 add of Arr 0x1052f2c0
      

      【讨论】:

      • 为什么 slice[0] 的地址等于地址 arr,为什么 slice[1] 和 arr[1] 的地址不同
      • 错了,引用的是同一个地方,slice的地址是&slice
      【解决方案4】:
      package main
      
      import (
          "fmt"
          "reflect"
          "unsafe"
      )
      
      func main() {
          intArr := [5]int{1, 2, 3, 4, 5}
          intSlice := intArr[:]
          fmt.Printf("slice addr= %p, len= %d, cap= %d\n", &intSlice, len(intArr), cap(intArr))
          fmt.Printf("array addr= %p, len= %d, cap= %d\n", &intArr, len(intArr), cap(intArr))
          fmt.Printf("slice first elem addr=%p\n", &intSlice[0])
          fmt.Printf("backend array of slice addr=%p\n", intSlice)
          fmt.Printf("backend array of slice addr=%#v\n", *((*reflect.SliceHeader)(unsafe.Pointer(&intSlice))))
      }
      

      输出:

      slice addr= 0xc0000a4018, len= 5, cap= 5
      array addr= 0xc0000b6000, len= 5, cap= 5
      slice first elem addr=0xc0000b6000
      backend array of slice addr=0xc0000b6000
      backend array of slice addr=reflect.SliceHeader{Data:0xc0000b6000, Len:5, Cap:5}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-21
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-22
        • 1970-01-01
        • 1970-01-01
        • 2015-04-06
        相关资源
        最近更新 更多