1. 零值
零值:空字符串 ”“
2. 类型
表示一组组合的集合。属于高级数据类型(复合数据类型)。
在 Go 语言中,一组 utf8编码的 unicode 字符集合。
支持两种定义字符串的方法:
- 反引号,`` 原生字符串。(多行字符串)
- 双引号,”” 解析字符串。(单行字符串)
原生和解析的差异在于是否对字符串中定义的特殊转义字符进行解析处理。原生就是不处理,解析就是处理。
示例:
func main() {
s1 := `begin\n\n\nend`
s2 := "begin\n\n\nend"
fmt.Println(s1, s2) // 输出 s1 不解析, s2 会解析\n 为换行
}
// 注意:s1 中的\n 并没有当做换行符来看待,就当做原生的\n 看待。说明反引号没有去 解析转义字符。
注意:原生字符串中,除了反引号外都是合法字符,不需要处理。
3. 转义字符
1)概述
转义:转换含义。某个字符除了其本身字符含义外,还具备其他含义,当需要其他含
义时,将其转换过来,就是转义字符。
例如:n,同时字符 n 和换行的含义: n 普通字符 , \n 换行符。
2)go 中支持的转义字符有:
- \a U+0007 alert or bell
- \b U+0008 backspace
- \f U+000C form feed
- \n 换行
- \r U+000D carriage return
- \t 制表符
- \v U+000b vertical tab
- \\ 反斜线
- \' U+0027 single quote (valid escape only within rune literals)
- \" 转义双引号
代码示例:
s3 := "1\t2\n3\"4"
fmt.Println(s3)
// 输出 :
// 1 2
// 3"4
3)转义字符码值
同样支持转义字符码值:主要是 ascii 码值和 unicode 码值。
存在两种语法:
\OOO 表示 三个八进制数的码值,对应的 ASCII 码中的内容(字母,数字,标点符号)
\xHHHH 表示 4 个十六进制数对应的 unicode 码值。
代码示例:
s3 := "\141" // 输出 a
s4 := "\u533a" // 输出 区
4. 运算
1)+,字符串连接符
s1 := "hello" + " " + "golang"
2)len(),长度计算
len() 获取字符串总长度。是字节的数量,而不是字符的数量。
字符一个独立的逻辑单位,无论汉字,英文,标点都是字符。
字节是空间单位。在 utf8 编码下,一个汉字三个字节。
utf8 变长字符集,字符可能占用 1-3 个字节。
注意: len() 属于内置函数,不用导入任何包,直接可以调用。Go 提供的内置函数不多。
代码示例:
s1 := "hello" // len 5
s2 := "你好hello" // len 11
3)索引访问
支持字节的索引访问。
代码示例:
s1 := "Golang"
fmt.Println(s1[0], s1[1]) // 输出为字节型数据 71 111
fmt.Println(string(s1[0]), string(s1[1])) // 转换为字符串才可 G o
string() 函数 是将某个字节转换为字符串,为内置函数。
注意:索引操作只能访问(读取),不能修改。
3)字符串类型是只读的
一个字符串类型一旦被构建,该数据不能被修改。
4)字符串切片
通过起止索引的方案,来完成子字符串的获取。
s[begin:end]
begin, 开始索引,可以省略,表示从 0 开始
end,结束的索引,结果中不包含 end,可以省略,表示到最后。
冒号不能省略。
代码示例:
s1 := "HelloGolang"
fmt.Println(s1[0:4], s1[4:], s1[0:], s1[:6], s1[:])
// 分别是 Hell oGolang HelloGolang HelloG HelloGolang
注意:字符串切片,得到的还是字符串类型数据。此处的切片,不是 Go 语言中数据类型切片的等 同概念。
5)strings包
概述:
相关文档:https://golang.google.cn/pkg/strings/
内置很多字符串的处理函数,详见上面的文档!
① Split () :使用分隔符将字符串拆分。
② Join () :使用连接符将字符串连接。
示例代码:
func main() {
s1 := "a-b-c-d"
s1Arr :=strings.Split(s1, "-")
fmt.Println(s1Arr) // 切片类型 输出 [a b c d]
fmt.Printf("%T\n", s1Arr) // 查看变量类型 为 []string
fmt.Println(strings.Join(s1Arr, "-")) // 字符串 输出 a-b-c-d
}
6)strconv包
将字符串类型的数据,转换为其他数据类型。
数据在传输时,往往都是字符串形式进行传输的,为了得到具体的数据类型,需要将数据从字符串类型,转换到其他类型。
① Atoi() :字符串转换为整型
func main() {
s1 := "42"
s1Int, _ := strconv.Atoi(s1)
fmt.Printf("%T\n", s1Int) // 输出: int
fmt.Println(s1Int) // 输出:42
}
4. 内部结构
字符串内部,其实是字节数组(字节集合),字符串类型数据记录了该字节数组的指针(内
存地址)和字符串的长度。
如图所示: