我们平时一般采用如下方式实现string与字符数组的转换:
a:="Hello World!"
var b = []byte(a)
fmt.Println(b)
c:=string(b)
fmt.Println(c)
这种形式虽然常用,但是会发生内存拷贝,在性能要求高的场景就不合适了。
string与字符数组如何实现零内存拷贝转换呢?
我们可以通过unsafe.Pointer操作指针来实现,具体实现如下:
import (
"fmt"
"reflect"
"unsafe"
)
func byte2string(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}
func string2byte(s string) (b []byte) {
bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
bh.Data = sh.Data
bh.Len = sh.Len
bh.Cap = sh.Len
return b
}
第一个函数实现[]byte转string,第二个函数实现string转[]byte,代码实现来自fasthttp框架。