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

转换之前,我们先了解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))
}

好了,喜欢的请点赞~

由于版权原因,本站共享资源只供云盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件并发送到[email protected]告知,我们会在收到邮件后72小时内删除。
想开点 » 【golang】利用unsafe实现零拷贝string与byte转换