字符串和字节 slice 之间可以相互转换:

s := "abc"
b := []byte(s)
s2 := string(b)

从概念上讲,一个[]byte(s)转换是分配了一个新的字节数组用于保存字符串数据的拷贝,然后引用这个底层的字节数组。编译器的优化可以避免在一些场景下分配和复制字符串数据,但总的来说需要确保在变量 b 被修改的情况下,原始的 s 字符串也不会改变。将一个字节 slice 转到字符串的 string(b)操作则是构造一个字符串拷贝,以确保 s2 字符串是只读的。

为了避免转换中不必要的内存分配,bytes 包和 strings 同时提供了许多实用函数。下面是 strings 包中的六个函数:

func Contains(s, substr string) bool
func Count(s, sep string) int
func Fields(s string) []string
func HasPrefix(s, prefix string) bool
func Index(s, sep string) int
func Join(a []string, sep string) string

bytes 包中也对应的六个函数:

func Contains(b, subslice []byte) bool
func Count(s, sep []byte) int
func Fields(s []byte) [][]byte
func HasPrefix(s, prefix []byte) bool
func Index(s, sep []byte) int
func Join(s [][]byte, sep []byte) []byte

它们之间唯一的区别是字符串类型参数被替换成了字节 slice 类型的参数。

欢迎转载,请注明出处~ 作者个人主页