一、Go 中的字符与字符串
字符与字符串
Go 默认使用 Unicode 字符集并使用 UTF-8 作为编码方式。Go 中没有字符类型,而是使用 byte 类型和 rune 类型来表示字符。
字符串可以转换为字符数组 []rune
和 字节数组 []byte
。
byte
类型表示 ASCII
码的一个字符,而 rune
类型,代表一个 UTF-8
字符,所以中文的处理使用 rune 类型,对 ASCII 码的处理使用 byte 类型;二进制传输的时候,使用 byte 类型会非常方便。
Go 中字符串就是由字符组成的一段固定长度的序列,字符串是不可修改的。Go 中字符 byte 使用单引号括起来,字符串 string 使用双引号括起来。
字符串的长度
len() 函数可以用来获取字符串的长度。
func main() { var zulu = "你好 Go" var yankee = "Hello Go" fmt.Println("zulu 字符串的长度为:", len(zulu)) fmt.Println("yankee 字符串的长度为:", len(yankee)) } 复制代码
执行上述代码,输出结果如下:
zulu 字符串的长度为: 9 yankee 字符串的长度为: 8 复制代码
UTF-8 编码中一个中文字符占三个字节。
字符串相当于一个只读的字符数组,如果字符串中只包含英文字符,那么字符串的长度就等于字符数组中字符的个数。
而对于包含中文的字符串来说,字符串的长度是不等于字符数组的长度的,而且 len() 函数作用于字符串时,取得是底层的 byte 数组的长度。要获取包含中文字符串底层字符数组的长度则先转为 rune 数组,再去获取数组的长度。
func main() { var zulu = "你好 Go" var yankee = "Hello Go" fmt.Println("zulu 字符串的长度为:", len(zulu)) fmt.Println("yankee 字符串的长度为:", len(yankee)) zulu_arr := []rune(zulu) fmt.Println(zulu_arr) fmt.Println("zulu 字符数组的长度为:", len(zulu_arr)) yankee_arr := []byte(yankee) fmt.Println(yankee_arr) fmt.Println("yankee 字节数组的长度为:", len(yankee_arr)) } 复制代码
执行上述代码,输出结果如下:
zulu 字符串的长度为: 9 yankee 字符串的长度为: 8 [20320 22909 32 71 111] zulu 字符数组的长度为: 5 [72 101 108 108 111 32 71 111] yankee 字节数组的长度为: 8 复制代码
转义字符
转义字符是一种特殊的字符串常量,通常以反斜线开头,包含一个或者多个字符。每个转义字符都有特殊含义,常用的转义字符有:
转义字符 | 转义字符具有的含义 |
\n | 换行符,将当前位置移到下一行开头 |
\r | 回车符,将当前位置移到本行开头 |
\t | 水平制表符跳到下一个TAB位置 |
\ | 代表一个反斜线字符 \ |
" | 代表一个双引号字符 " |
func main() { c := "\n" fmt.Println(c) d := "\" fmt.Println(d) e := """ fmt.Println(e) f := "?" fmt.Println(f) } 复制代码
执行上述代码,输出结果如下:
\n \ " ? 复制代码
二、Go 中字符串的常用操作
Package strings implements simple functions to manipulate UTF-8 encoded strings.
Go 中的 strings
标准库提供了字符串的基本操作,常见的字符串操作有:
- 获取字符串求长度
- 获取字符串的子串
- 判断是否包含某个字符或者子串
- 获取子串出现的次数(字符串匹配)
- 字符串分割(切分)成[]string
- 判断字符串是否存在某个前缀或后缀
- 获取字符或者子串在字符串中首次出现的位置或最后一次出现的位置
- 通过某个字符串将[]string进行拼接
- 获取字符串重复次数
- 字符串中子串替换
- 大小写转换
更多的操作可以参考 Go 官方文档中的 Package strings 或者 strings 标准库的 中文文档
字符串查询和判断相关操作
func main() { name := "Stark" slogan := "I am IRONMAN, Tony Stark" fmt.Println("slogan 变量是否包含 "Stark":", strings.Contains(slogan, name)) fmt.Println("slogan 变量中 "Stark" 字串的索引为:", strings.Index(slogan, name)) fmt.Println("slogan 变量中 "a" 出现的次数为:", strings.Count(slogan, "a")) fmt.Println("slogan 变量是否以 "I" 开头:", strings.HasPrefix(slogan, "I")) fmt.Println("slogan 变量是否以 "Stark" 结尾:", strings.HasSuffix(slogan, "Stark")) } 复制代码
执行上述代码,输出结果如下:
slogan 变量是否包含 "Stark": true slogan 变量中 "Stark" 字串的索引为: 19 slogan 变量中 "a" 出现的次数为: 2 slogan 变量是否以 "I" 开头: true slogan 变量是否以 "Stark" 结尾: true 复制代码
字符串更新相关操作
func main() { // 大小写替换 fmt.Println("Stark 改为全部大写:", strings.ToUpper("Stark")) fmt.Println("Stark 改为全部小写:", strings.ToLower("Stark")) fmt.Println("the summer 改为 Title 样式:", strings.ToTitle("the summer")) // 去除空格 fmt.Println("去除字符串中左右两边的空格:", strings.TrimSpace(" Hello Go ")) fmt.Println("去除字符串左边的 H:", strings.TrimLeft("Hello Go", "H")) fmt.Println("去除字符串左边的 o:", strings.TrimRight("Hello Go", "o")) // 指定的字符串不是在左右边的位置,则去除失败,字符串不变 fmt.Println("去除字符串左边的 o:", strings.TrimRight("Hello Go ", "o")) // 去掉左右两边指定的字符,如果不包含指定的字符,去除失败 fmt.Println("去掉左右两边指定的字符:", strings.Trim("HelloH", "H")) } 复制代码
执行上述代码,输出结果如下:
Stark 改为全部大写: STARK Stark 改为全部小写: stark the summer 改为 Title 样式: THE SUMMER 去除字符串中左右两边的空格: Hello Go 去除字符串左边的 H: ello Go 去除字符串左边的 o: Hello G 去除字符串左边的 o: Hello Go 去掉左右两边指定的字符: ello 复制代码
字符串的分割与合并相关操作
func main() { location := []string{"usr", "local", "opt", "info.txt"} fmt.Println(strings.Split("/usr/local/opt/info.txt", "/")) fmt.Println(strings.Join(location, "/")) fmt.Println(strings.Replace("/usr/local/opt/info.txt", "/", "\", 4)) } 复制代码
执行上述代码,输出结果如下:
[ usr local opt info.txt] usr/local/opt/info.txt \usr\local\opt\info.txt