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框架。