二行不能理解的代码

zjfy286 · · 3753 次点击
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
更多评论
fmt.Println(*(*string)(unsafe.Pointer(ptr))) 这行用的是ptr 不解
#1
你如果会C的话就很容易理解: char buf[xxx] =....; //开个大空间 header = (stringHeader *)&buf[0] ; //把刚才的空间看成一个结构 结构体内的data指针是一样的原理, 只不过指向自己内部的一个空间 , 不过这里的‘h' 'c'前面的1怎么回事
#2