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行的意义是什么,求解惑
有疑问加站长微信联系(非本文作者)
fmt.Println((string)(unsafe.Pointer(ptr)))
这行用的是ptr 不解
你如果会C的话就很容易理解: char buf[xxx] =....; //开个大空间
header = (stringHeader *)&buf[0] ; //把刚才的空间看成一个结构
结构体内的data指针是一样的原理, 只不过指向自己内部的一个空间 , 不过这里的‘h' 'c'前面的1怎么回事
打印出ptr就是为了展示,当header结构体中的第一个属性的地址改变的时候,并不修改改变量原来的地址所引用的值的意思吧。如果不是这样,ptr打印出来就是'h'了。
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)) 是一样的 写法。