3.1.常量、操作符和转义
字符串常量使用双引号(”)或者反引号(’)来创建。双引号用于创建可解析的字符串常量,这些字符串支持表3.1列出的转义字符,但是不能跨行。反引号用于创建原生的字符串常量,这些字符串可以可以跨多个行;它们不支持任何转义序列且可以包含除了反引号之外的任何字符。可解析的字符串常量是最常使用的,但是使用原生的字符串常量来编写多行消息、HTML和正则表达式是非常有用的。
1 2 3 | text1 := "\"what's that?\", he said" // Interpreted string literal text2 := `"what's that?", he said` // Raw string literal radicals := "√ \u221A \U0000221a" // radicals == "√ √ √" |
表3.1 Go语言的字符串和字符转义
\\ | 反斜线(\) |
\ooo | 3个8位八进制码点表示的Unicode字符 |
\’ | 单引号(’);仅可用于字符常量内 |
\” | 双引号(”);仅可用于可解析夫人字符串常量内 |
\a | ASCII 响铃符(BEL) |
\b | ASCII 退格(BS) |
\f | ASCII 换页(FF) |
\n | ASCII 换行(LF) |
\r | ASCII 回车 (CR) |
\t | ASCII 制表符(TAB) |
\uhhhh | 4个16位十六进制码点表示的Unicode字符 |
\Uhhhhhhhh | 8个32位十六进制码点表示的Unicode字符 |
\v | ASCII 垂直制表符 (VT) |
\xhh | 2个8位十六进制码点表示的Unicode字符 |
上面例子中创建的3个变量都是字符串类型, text1和text2包含完全相同的文本。由于.go文件使用UTF-8编码,所以我们可以在它们中包含Unicode字符而无需拘泥于形式。然而,正像例子中的所做的那样,我们可以使用Unicode的转义符来表示第二个和第三个√符号。但在这个特殊的例子中,我们不能使用八进制或者十六进制的转义符,因为它们的码点取值范围局限在U+0000到U+00FF之间,对于√符号的码点值U+221A来说太小了。
如果我们想要创建一个长的可解析字符串常量而又不希望在代码中占用很长的一行,那么我们可以创建多个常量片段,使用+连接操作符将这些片段连接起来。此外,虽然Go语言的符串是不可变的,但它们支持+=追加操作符:如果基础字符串容量不够大而不足以容纳要追加的字符串,追加操作将导致基础字符串被要追加的字符串替换。表3.2列出了这些运算符。可以使用比较操作符来比较字符串(参见表2.3)。下面是使用这些操作符的一些示例。
1 2 3 4 | book := "The Spirit Level" + // String concatenation " by Richard Wilkinson" book += " and Kate Pickett" // String append fmt.Println("Josey" < "José", "Josey" == "José") // String comparisons |
表3.2 字符串操作
所有只包含7位ASCII 字符的字符串都可使用[]切片操作符;但是在使用包含非ASCII字符的字符串时要多加注意。可以使用标准比较操作符<,<=,==,!=,>=,>=(参见表2.3)来比较字符串。
s += t | 将字符串t追加到字符串s |
s + t | 字符串t和s连接 |
s[n] | 字符串s中索引为n的原始字节 |
s[n:m] | 字符串s中截取索引从n到m-1的子字符串 |
s[n:] | 字符串s中截取索引从n到len(s)-1的子字符串 |
s[:m] | 字符串s中截取索引从0到m-1的子字符串 |
len(s) | 字符串s中的字节数 |
len([]rune(s)) | 字符串s中的字符数,可以使用速度更快的utf8. RuneCountInString()替代,参见表3.10 |
[]rune(s) | 将字符串转换为Unicode码点切片 |
string(chars) | 将[]rune 或[]int32转换为字符串;rune 或int32为Unicode码点 |
[]byte(s) | 将字符串s转换为原始字节切片片;不保证字节切片是合法的UTF-8 |
string(bytes) | 将[]byte 或 []uint8转换为字符串;不保证字节切片是合法的UTF-8 |
string(i) | 将任意整型i转换为字符串;i是一个Unicode码点;例如string(65)返回‘A’ |
strconv.Itoa(i) | 整型i的字符串表示;例如i的值是65,则返回(“65”,nil);参见表3.8和表3.9 |
fmt.Sprint(x) | 任意类型的x的字符串表示;例如x是整型的65,则返回字符串“65”;参见表3.3 |