Go 语言笔记:字符串
字符串类型
字符串是一种值类型,值不可变,即不可修改(修改会重新分配内存,原始字符串还保留),字符串是字节定长数组。 Go
支持两种形式的字符串:
解释字符串:使用双引号扩起来,其中的转义符(详见表格[转义符][#转义符])会被替换
go
package main
func main() {
name := "This is a wonderful \n world "
println(name)
}
输出:
This is a wonderful
world
非解释字符串:使用反引号括起来,支持转义符原样输出,同时反引号支持多行字符串
go
package main
func main() {
name := `This is a wonderful \n world`
println(name)
}
输出:
This is a wonderful \n world
转义符
常见的转义符见如下表格
转义符 | 含义 |
---|---|
\a | 响铃 |
\b | 退格 |
\f | 换页 |
\r | 回车符(返回行首) |
\n | 换行符(直接跳到下一行的同列位置) |
\t | 制表符 |
\v | 垂直制表符 |
' | 单引号 |
" | 双引号 |
\ | 反斜杠 |
- 字符串比较可以使用比较运算符(==、!=、<、<=、>=、>)通过在内存中按照字节比较来实现字符串的对比;
- 字符串长度可以使用 len(str) 来获取字符串所占的字节长度,使用 utf8.RuneCountInString(str) 来统计字符个数;
- 字符串拼接可以使用
+
或者+=
来实现,s := s1 + s2
ors += s3
,也可以使用strings.join
函数来拼接,以及更高效的bytes.Buffer
来实现拼接; - 另外,获取字符串中某个字节的地址的行为是非法的,如
&str[i]
。
go
package main
import "unicode/utf8"
func main() {
name := `Hello,世界`
println(len(name)) // 13
println(utf8.RuneCountInString(name)) // 9
s := "Hello" + ", Lemon"
println(s) // Hello, Lemon
s += "!"
println(s) // Hello, Lemon!
println(&name[1]) // 编译报错:Cannot take the address of name[1]
}
字符串修改
修改字符串需要先将其转换成 []rune
或者 []byte
, 完成后再转换为 string
, 修改操作会重新分配内存,复制字节数组
go
package main
func main() {
changeString()
}
func changeString() {
str1 := "Hello world"
byteStr := []byte(str1)
byteStr[0] = 'p'
println(string(byteStr)) // pello world
println(str1) // Hello world
str2 := "Hello 柠檬"
runeStr := []rune(str2)
runeStr[6] = '柚'
runeStr[7] = '子'
println(string(runeStr)) // Hello 柚子
println(str2) // Hello 柠檬
str2[0] = 'L' // 直接修改字符串报错:cannot assign to str2[0]
}