在Go语言中string类型与[]byte强制类型转化的是后会发生内存拷贝,这是由于这两种类型的特性所决定的;
string类型是不允许修改内容,[]byte是可以修改的。
下面提供两个函数使用时不会发生内存拷贝吗,但是使用过程中药慎重,确保不会修改底层内容,否则很大可能会导致程序异常
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
}