简介
string与byte的转换是最常见的一种,通常我们会使用强转方式,但其实还有另一种更加高效的方式,本文会演示两种转换方式。
普通转换
func main() {fmt.Println([]byte("abcd"))fmt.Println(string([]byte{'1', '2', '3'}))
}输出
[97 98 99 100]
123
高效转换
上面的转换虽然简单,但是效率不高,因为存在一次拷贝,需要新开辟内存,但其实string与[]byte的数据结构非常相似,只不过[]
byte多了一个容量大小cap,那么其实只要把值的引用地址切换一下,把cap加上就可以了
而引用地址的转换可以使用unsafe.Pointer做到,当然这个不确定高版本会不会再支持,需要注意
转换实现如下
func main() {fmt.Println(StringToBytes("abcd"))fmt.Println(BytesToString([]byte{'1', '2', '3'}))
}func BytesToString(b []byte) string {return *(*string)(unsafe.Pointer(&b))
}func StringToBytes(s string) []byte {return *(*[]byte)(unsafe.Pointer(&struct {stringCap int}{s, len(s)},))
}输出
[97 98 99 100]
123
欢迎关注,学习不迷路!