golang []byte 和 string 无拷贝转换

最好不要用这种方式:

    var line string
    bytes := *(*[]byte)(unsafe.Pointer(&line)) // 遇到bytes的len大于0,cap为0的情况,操作bytes的时候,会panic

    var d []byte
    line = *(*string)(unsafe.Pointer(&d))

推荐以下方式:

import (
    "reflect"
    "unsafe"
)

func String(b []byte) (s string) {
    pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b))
    pstring := (*reflect.StringHeader)(unsafe.Pointer(&s))
    pstring.Data = pbytes.Data
    pstring.Len = pbytes.Len
    return
}

func Slice(s string) (b []byte) {
    pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b))
    pstring := (*reflect.StringHeader)(unsafe.Pointer(&s))
    pbytes.Data = pstring.Data
    pbytes.Len = pstring.Len
    pbytes.Cap = pstring.Len
    return
}
原文地址:https://www.cnblogs.com/zhouj-happy/p/12486878.html