string与[]byte经常需要互相转化,普通转化会发生底层数据的复制。如果是临时使用的字符串可以通过unsafe包直接转化数据,不需要内存拷贝
func BytesToStringFast(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}
func StringToBytes(s string) []byte {
sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
bh := reflect.SliceHeader{sh.Data, sh.Len, 0}
return *(*[]byte)(unsafe.Pointer(&bh))
}
这种方法有需要注意的地方,使用转化后的结果时必须要保证原内存还在,临时变量比较合适这种场景,如:byte2int
func parseIntBytes(b []byte, base int, bitSize int) (i int64, err error) {
s := unsafeBytesToString(b)
return strconv.ParseInt(s, base, bitSize)
}
有疑问加站长微信联系(非本文作者)