```
package main
import (
"fmt"
"unsafe"
)
type stringssHeader struct {
Data unsafe.Pointer
Len int
Byt byte
}
func main() {
var bytes = []byte{0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 'h', 'c'}
var ptr = &bytes[0]
header := (*stringssHeader)(unsafe.Pointer(ptr))
header.Data = unsafe.Pointer(&bytes[17])
fmt.Println(*(*string)(unsafe.Pointer(ptr)))
}
```
header := (*stringssHeader)(unsafe.Pointer(ptr))
header.Data = unsafe.Pointer(&bytes[17])
这2行的意义是什么,求解惑
var ptr = &bytes[0] 取出bytes 首地址。
header := (*stringssHeader)(unsafe.Pointer(ptr)) 将地址强行转换成为stringssHeader类型的指针。
[]byte{0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 'h', 'c'}
第一个0 :Data unsafe.Pointer,这个时候是空指针。
第二个"0, 0, 0, 0, 0, 0, 0, 2" 这个八位是 Len ,
第三 “0, 0, 0, 0, 0, 0, 0, 1” 是 Byt 。
header.Data = unsafe.Pointer(&bytes[17]) 赋值之后 Data 就不是空指针了。
(*string)(unsafe.Pointer(ptr)) 和 (*stringssHeader)(unsafe.Pointer(ptr)) 是一样的 写法。
#4
更多评论
你如果会C的话就很容易理解:
char buf[xxx] =....; //开个大空间
header = (stringHeader *)&buf[0] ; //把刚才的空间看成一个结构
结构体内的data指针是一样的原理, 只不过指向自己内部的一个空间 ,
不过这里的‘h' 'c'前面的1怎么回事
#2