golang字符串string与字符数组[]byte如何实现零内存拷贝转换

 阅读大约需要1分钟

我们平时一般采用如下方式实现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框架。