golang 编程笔记

【golang】利用unsafe实现零拷贝string与byte

2020-05-11  本文已影响0人  dongzd

转换之前,我们先了解string与byte的底层结构

string
type StringHeader struct {  
    Data uintptr    
    Len  int    
}   
slice
type SliceHeader struct {   
    Data uintptr    
    Len  int    
    Cap  int    
}

利用unsafe.Pointer进行类型转换,完成数据展示,因为slice与string底部数据存储方式都是uintptr以byte形式

string转byte
func stringTobytes(s string) []byte {
    str := (*reflect.StringHeader)(unsafe.Pointer(&s))
    by := reflect.SliceHeader{
        Data: str.Data,
        Len:  str.Len,
        Cap:  str.Len,
    }
  //在把by从sliceheader转为[]byte类型
    return *(*[]byte)(unsafe.Pointer(&by))
}

byte转string
func byteToString(b []byte) string {
    by := (*reflect.SliceHeader)(unsafe.Pointer(&b))

    str := reflect.StringHeader{
        Data: by.Data,
        Len:  by.Len,
    }
    return *(*string)(unsafe.Pointer(&str))
}
上一篇下一篇

猜你喜欢

热点阅读