1、字符串类型
字符串是一种值类型,且值不可变,即创建某个文本后将无法再次修改这个文本的内容,字符串是字节的定长数组。
1)定义字符串
可以使用双引号""来定义字符串,字符串中可以使用转义字符来实现换行、缩进等效果。
一般的比较运算符(==、!=、<、<=、>=、>)是通过在内存中按字节比较来实现字符串比较的,因此比较的结果是字符串自然编码的顺序。字符串所占的字节长度可以通过函数 len() 来获取。
字符串的内容(纯字节)可以通过标准索引法来获取,在方括号[]内写入索引,索引从 0 开始计数。
2)字符串拼接符“+”
两个字符串 s1 和 s2 可以通过 s := s1 + s2 拼接在一起。将 s2 追加到 s1 尾部并生成一个新的字符串 s。也可以使用“+=”来对字符串进行拼接。
示例:
package main import "fmt" func main() { var s1 = "hello" + ", world" var s2 = "hello" + ", world" var s3 = "hello" s3 += ", world" fmt.Println(s1) fmt.Println(s2) fmt.Println(s3) }
3)字符串实现基于UTF-8编码
Go语言中字符串的内部实现使用 UTF-8 编码,通过 rune 类型,可以方便地对每个 UTF-8 字符进行访问。当然,Go语言也支持按照传统的 ASCII 码方式逐字符进行访问。
4)定义多行字符串
在Go语言中,使用双引号书写字符串的方式是字符串常见表达方式之一,被称为字符串字面量(string literal),这种双引号字面量不能跨行,如果想要在源码中嵌入一个多行字符串时,就必须使用`
反引号。
在这种方式下,反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。
示例:
package main import "fmt" func main() { var str = `你好\n 世界\n` fmt.Println(str) }
2、计算字符串长度
len() 函数的返回值的类型为 int,表示字符串的 ASCII 字符个数或字节长度。
如果希望按习惯上的字符个数来计算,就需要使用 Go 语言中 UTF-8 包提供的 RuneCountInString() 函数,统计 Uncode 字符数量。
示例:
package main import ( "fmt" "unicode/utf8" ) func main() { var s1 = "abc" var s2 = "你好a" fmt.Printf("s1: %v\n", len(s1)) // 3 fmt.Printf("s2: %v\n", len(s2)) // 7 fmt.Printf("s1: %v\n", utf8.RuneCountInString(s1)) // 3 fmt.Printf("s2: %v\n", utf8.RuneCountInString(s2)) // 3 }
3、遍历字符串
ASCII 字符串遍历直接使用下标。
Unicode 字符串遍历用 for range。
示例:
package main import "fmt" func main() { var str = "你好,world" for i := 0; i < len(str) ; i++ { fmt.Printf("%c, %d\n", str[i], str[i]) } fmt.Println("-------------------------") for _, s := range str{ fmt.Printf("%c, %d\n", s, s) } }
4、字符串截取
strings.Index:正向搜索子字符串。
strings.LastIndex:反向搜索子字符串。
搜索的起始位置可以通过切片偏移制作。
示例:
package main import ( "fmt" "strings" ) func main() { var str = "你好, world, new" pos := strings.Index(str, ",") lastPos := strings.LastIndex(str, ",") fmt.Printf("pos = %d, lastPos=%d\n", pos, lastPos) // pos = 6, lastPos=13 }
5、修改字符串
Go 语言的字符串是不可变的。
修改字符串时,可以将字符串转换为 []byte 进行修改。
[]byte 和 string 可以通过强制类型转换互转。
示例:
package main import "fmt" func main() { var str = "hello, world" strBytes := []byte(str) for i := 5; i <= 6 ; i++ { strBytes[i] = '-' } fmt.Println(string(strBytes)) // hello--world }
6、字符串拼接
除了加号连接字符串,Go 语言中也有类似于 StringBuilder 的机制来进行高效的字符串连接。
示例:
package main import ( "bytes" "fmt" ) func main() { var stringBuilder bytes.Buffer // 声明字节缓冲 // 把字符串写入缓冲 stringBuilder.WriteString("hello,") stringBuilder.WriteString("世界") // 将缓冲以字符串形式输出 fmt.Println(stringBuilder.String()) }
7、格式化输出
fmt.Sprintf(格式化样式, 参数列表…)
格式化样式:字符串形式,格式化动词以%开头。
参数列表:多个参数以逗号分隔,个数必须与格式化样式中的个数一一对应,否则运行时会报错。
示例:
package main import "fmt" func main() { name := "hello" str := fmt.Sprintf("%s, world", name) fmt.Println(str) }