我們平時一般採用如下方式實現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框架。