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)
}
浙公网安备 33010602011771号