golang实现不分配额外内存[]byte和string转换
普通的强转
一般在进行[]byte 和string之间进行转换时,通过进行强转实现。这样进行强转的话,都会在额外的拷贝,从而造成额外的内存分配。
str := "test"
// 转换为[]byte
bytes := []byte(str)
// 转换为str
str1 := string(bytes)
优化后
// 通过底层数据转换
package strbytesconv
import (
"reflect"
"unsafe"
)
// StringToBytes 实现string 转换成 []byte, 不用额外的内存分配
func StringToBytes(str string) (bytes []byte) {
ss := *(*reflect.StringHeader)(unsafe.Pointer(&str))
bs := (*reflect.SliceHeader)(unsafe.Pointer(&bytes))
bs.Data = ss.Data
bs.Len = ss.Len
bs.Cap = ss.Len
return bytes
}
// BytesToString 实现 []byte 转换成 string, 不需要额外的内存分配
func BytesToString(bytes []byte) string {
return *(*string)(unsafe.