如果添加fmt.Printf,为什么golang程序会出现恐慌?

时间:2020-04-24 10:16:26

标签: go panic

我不知道如果添加fmt.Printf("%p\n", sHdr)为何程序会出现紧急情况,如果不存在就可以了。有人可以给我一些线索吗?非常感谢。

package main

import (
      "fmt"
      "reflect"
      "unsafe"
)

func main() {
      s := "hello world"

      sHdr := (*reflect.StringHeader)(unsafe.Pointer(&s))
      fmt.Println(sHdr.Len)
      fmt.Println(*(*byte)(unsafe.Pointer(sHdr.Data)))

      b := *(*[]byte)(unsafe.Pointer(sHdr))
      fmt.Printf("%p\n", sHdr)                  // this line
      fmt.Println(len(b), cap(b))
      fmt.Println(string(b[:len(s)]))
      fmt.Println(b[:len(s)])
  }

输出如下:

11
104
0xc000010200
11 0
panic: runtime error: slice bounds out of range [:11] with capacity 0

goroutine 1 [running]:
main.main()
        /Users/xsky/go/src/github.com/microyahoo/go-exercises/advanced_go/test_string.go:19 +0x3c6
exit status 2

如果我将fmt.Printf("%p\n", sHdr)的行注释掉,程序将正常运行。

11
104
11 824634167072
hello world
[104 101 108 108 111 32 119 111 114 108 100]

0 个答案:

没有答案
相关问题