标准转换:
// string to []byte
s1 := "hello"
b := []byte(s1)
// []byte to string
s2 := string(b)
但有时在开源代码中,我们会看到如下的 []byte 和 string 互转的代码:
func String2Bytes(s string) []byte {
sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
bh := reflect.SliceHeader{
Data: sh.Data,
Len: sh.Len,
Cap: sh.Len,
}
return *(*[]byte)(unsafe.Pointer(&bh))
}
func Bytes2String(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}
强制转换的方式性能会明显优于普通的转换。
原理
type byte = uint8
type slice struct {
array unsafe.Pointer
len int
cap int
}
type StringHeader struct {
Data uintptr
Len int
}
type SliceHeader struct {
Data uintptr
Len int
Cap int
}
a := "hello"
b := String2Bytes(a)
b[0] = 'H'