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

【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))
}

好了,喜欢的请点赞~

技术

NLP-心法利器[7] | 漫谈语义相似度与语义向量表征

2022-5-23 8:36:13

golang技术

【Golang】逃逸分析

2022-5-28 2:04:36

搜索