unsafe.Pointer
作用:用于各种指针相互转换的桥梁
- 任何类型的指针和unsafe.Pointer可以相互转换
- uintptr和unsafe.Pointer可以相互转换
uintptr
作用:存储指针的整型,底层类型是int
重点
uintptr与unsafe.Pointer可相互转换
区别:
- unsafe.Pointer只是单纯的通用指针类型,用于不同指针转换,不可以参与指针运算
- uintptr用于指针运算,GC不把uintptr当指针,无法持有对象,目标会被回收
用处
例:byte切片与string转换优化
通过unsafe包转换可以避免内存拷贝从而提高效率
func UnsafeBytesToString(bytes []byte) string {
hdr := &reflect.StringHeader{
Data: uintptr(unsafe.Pointer(&bytes[0])),
Len: len(bytes),
}
return *(*string)(unsafe.Pointer(hdr))
}
网友评论