Почему golang программа pani c при добавлении fmt.Printf? - PullRequest
1 голос
/ 24 апреля 2020

Я понятия не имею, почему программа будет панировать c, если я добавлю 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]
...