Skip to content

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 or s += 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]
}

Released under the MIT License.