golang 如何通过unsafe.Pointer uintpt
2020-03-07 本文已影响0人
_老七
主要是对unsafe.Pointer uintptr的一个应用实例,顺便了解golang的string与slice底层是怎样实现的
func Str2bytes(s string) []byte {
x := (*[2]uintptr)(unsafe.Pointer(&s))
h := [3]uintptr{x[0], x[1], x[1]}
return *(*[]byte)(unsafe.Pointer(&h))
}
func Bytes2str(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}
Str2bytes
:方法代码解释
// 如果了解string底层实现,就明白了。string底层其它就是一个结构体
// string 底层实现
type stringStruct struct {
str unsafe.Pointer
len int
}
x := (*[2]uintptr)(unsafe.Pointer(&s)) //返回的是string的struct信息,x[0]:是s的首指针[对应对应底层str],x[1]:对应字符串的长度[对应底层len]
// 再来看下slice的底层实现
type slice struct {
array unsafe.Pointer
len int
cap int
}
// 结合slice底层,下面这句代码就明白了吧
h := [3]uintptr{x[0], x[1], x[1]} // unsafe.Pointer转换后,x[0]对应array指针,x[1]对应len,x[2]:对应cap