Go语言中字符串和字节切片的基本概念
在Go语言中,字符串是以UTF-8编码存储的字符序列,因此每个字符长度是不确定的,一般来说占1到4个字节。字节切片(byte slice)是Go语言中的一个重要类型,它类似于数组,但是长度是动态的,可以根据需要进行扩展或缩减。在Go语言中,字符串可以通过转换成字节切片进行操作,如字节切片的复制、截取等操作。也可以通过字节切片创建字符串。
将字符串转换为字节切片
使用[]byte函数
Go语言中可以使用[]byte函数将字符串转换为字节切片,该函数返回一个字节切片,其元素为原字符串中每个字符的ASCII码值。
代码示例:
s := "hello world"
b := []byte(s)
fmt.Printf("%v", b)
上述代码中,将字符串“hello world”转换为字节切片,然后通过fmt.Printf函数输出字节切片b中的元素,结果为[104 101 108 108 111 32 119 111 114 108 100]。
使用[]rune函数
Go语言中还可以使用[]rune函数将字符串转换为rune(Unicode码点)切片,该函数返回一个rune切片,其元素为原字符串中每个字符的Unicode码点值。
代码示例:
s := "hello 世界"
r := []rune(s)
fmt.Printf("%v", r)
上述代码中,将字符串“hello 世界”转换为rune切片,然后通过fmt.Printf函数输出rune切片r中的元素,结果为[104 101 108 108 111 32 19990 30028]。
将字节切片转换为字符串
使用string函数
可以使用Go语言中的string函数将字节切片转换为字符串,该函数返回一个字符串,其值为字节切片中各元素对应的Unicode字符。
代码示例:
b := []byte{104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100}
s := string(b)
fmt.Printf("%v", s)
上述代码中,将字节切片[104 101 108 108 111 32 119 111 114 108 100]转换为字符串,然后通过fmt.Printf函数输出字符串s,结果为“hello world”。
将[]rune转为string
和上面字节切片的转换一样,在Go语言中,还可以使用string函数将rune切片(Unicode码点)转换为字符串,该函数返回一个字符串,其值为rune切片中各元素对应的Unicode字符。
代码示例:
r := []rune{104, 101, 108, 108, 111, 32, 19990, 30028}
s := string(r)
fmt.Printf("%v", s)
上述代码中,将rune切片[104 101 108 108 111 32 19990 30028]转换为字符串,然后通过fmt.Printf函数输出字符串s,结果为“hello 世界”。
字符串转字节切片的容量
在上面介绍的字符串转字节切片的方法中,使用[]byte函数可以将字符串转换为字节切片,使用string函数可以将字节切片转换为字符串。这两种方法的容量大小和原字符串的长度有关,具体来说,如果原字符串中的字符全部为ASCII字符(1个字节),那么转换后的字节切片长度为原字符串的长度;如果原字符串中有非ASCII字符(占用2个或3个字节),那么转换后的字节切片长度可能会比原字符串的长度大。
例如,将一个全是ASCII字符的字符串转换为字节切片,它们的长度是相等的:
s := "hello world"
b := []byte(s)
fmt.Printf("%d %d\n", len(s), len(b))
输出结果为:
11 11
但是,如果原字符串中有非ASCII字符,它们的长度会增加:
s := "你好,世界"
b := []byte(s)
fmt.Printf("%d %d\n", len(s), len(b))
输出结果为:
7 12
可以看到,原字符串“你好,世界”的长度为7个字符,但是转换后的字节切片长度为12,大于原字符串的长度。
总结
在Go语言中,可以使用[]byte函数将字符串转换为字节切片,使用string函数将字节切片转换为字符串。如果原字符串中有非ASCII字符,它们转换后的字节切片长度可能会比原字符串的长度大。编写Go语言程序时,需要注意字符串和字节切片的含义和相互转换的方法。