- string 底层是一个 byte数组,因此 string也可以进行切片处理
package main
import "fmt"
func main() {
str1 := 'hello'
slice := str1[1:4] // 结果是 'ell',类型是 string
fmt.Println(slice) // 输出: ell
fmt.Printf("%T\n", slice) // 输出: string
}
- string 和切片在内存的形式
-
string是不可变的,不能通过 str[0] = 'H' 来修改字符串中的字符
-
如果需要修改 string 中的内容,可以将string转为 []byte 或 []rune 进行修改,然后再转回 string
-
[]byte 只能处理 ASCII 字符,对于 Unicode 字符可能会出现问题,因为一个 Unicode 字符可能占用多个 byte
-
[]rune 可以正确处理 Unicode 字符,因为它是以 Unicode 码点为单位的切片
-
如果字符串有中文,需要修改内容,可以转为 []rune 来处理。如果只有英文和数字,可以使用 []byte 来处理
package main
import "fmt"
func main() {
// 只有英文和数字的字符串,可以使用 []byte 来处理
str1 := 'hello'
byteSlice := []byte(str1) // 转为 byte 切片
byteSlice[0] = 'H' // 修改切片内容
str2 := string(byteSlice) // 转回 string
fmt.Println(str2) // 输出: Hello
// 有中文需要使用[]rune处理
str3 := '你好,世界'
runeSlice := []rune(str3) // 转为 rune 切片
runeSlice[0] = '您' // 修改切片内容
str4 := string(runeSlice) // 转回 string
fmt.Println(str4) // 输出: 您好,世界
}