1. 什么是字符串?
在Go中字符串是byte数组。可以通过将内容放在 " "之间的方式来创建一个字符串。如下:
s := "I am string"
Go中的字符串符合Unicode标准,并以UTF-8编码。
2. 访问字符串中的字节、遍历
因为字符串实际上是byte数组,所以可以通过下标访问一个字符串的单个字节,也可以遍历。如下:
str := "Hello World"
for i, v := range str {
fmt.Printf("[%d] : %c\n", i, v)
}
for i:=0; i<len(str); i++ {
fmt.Printf("[%d] : %c\n", i, str[i])
}
3. 通过byte切片来创建字符串
注意:数组不可以用来创建字符串。
// 通过byte切片创建字符串
byteSlice := []byte{0x43, 0x61, 0x66, 0xc3, 0xA9} // 这里用对应的十进制数同样ok
str := string(byteSlice) // 这里如果传的是数组,而不是切片,会报错
4. 潜在的隐患 -- 打印输出
str := "Señor"
for i:=0; i<len(str); i++ {
fmt.Printf("%c ", str[i])
}
fmt.Printf("\n") //输出结果为:S e à ± o r
由于 ñ 的Unicode码点是 U+00F1,它的UTF-8编码占了两个字节。所以试图将两个字符当做一个字符来打是错误的。这时候可以用rune来解决这个问题,它是Go中的一种字符类型。
5. 字符类型
在Go语言中支持两种字符类型:
-- byte:代表单个UTF-8字符串的字节
-- rune:代表单个Unicode的字符
现在用rune类型对上面的代码进行修改:
//rune解决隐患
str := "Señor"
str_rune := []rune(str)
for i:=0; i<len(str_rune); i++ {
fmt.Printf("%c ", str_rune[i])
}
fmt.Printf("\n") //输出结果为:S e ñ o r
对于字符串str,获取它的长度:
//字符串长度
str := "Señor"
fmt.Println("length of utf-8:", utf8.RuneCountInString(str)) //输出结果为:length of utf-8: 5
fmt.Println("length of byte:", len(str)) //输出结果为:length of byte: 6
可以看到,如果字符串中有这种实际占了两个字节的字符,那么就要用rune来处理了,否则会出错。
6. 修改字符串的值
不可以通过下标来修改字符串中的字符,因为创建的字符串是不可变的。
但可以将字符串变量整个重新赋值:
str := "Hello World"
//str[0] = 'Y' // 非法
str = "Yello World" // 正确
如果有需要改变一个字符串中单个字符的需求,通过rune来实现:
//通过rune修改字符串
str := "Hello World"
new_str := []rune(str)
new_str[0] = 'Y'
str = string(new_str)
fmt.Println(str)
7. 截取字符串
截取英文的字符串:
//截取字符串
sourceStr := "XHelloWorldX"
str := sourceStr[1:len(sourceStr)-1] //输出结果为:HelloWorld (开始的下标,结束的后一位的下标)
fmt.Println(str)
如果是中文,还是用rune:
//截取字符串--中文
source := "AB我透你CD"
str := string([]rune(source)[2:5])
fmt.Println(str) //输出结果为:我透你