我不知道如果添加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]