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