Golang 语法速通指南(四)基本数据类型之字符串
定义
有的人说 Golang = C + Python ,这句话不假,像函数、数值变量的类型等都能看见 C 的影子,而 Go 中最像 Python 的地方就是字符串了
1 | s := "hello, world" |
访问
这点和 Python 一模一样
使用索引
1 | fmt.Println(s[0], s[7]) // "104 119" ('h' and 'w') |
使用切片
1 | fmt.Println(s[0:5]) // "hello" |
运算符
使用 + 可以连接两个字符串
1 | fmt.Println("goodbye" + s[5:]) // "goodbye, world" |
比较大小也与 Python 中的相同
1 | println("123" > "120000") // True |
编辑
和 Python 一样,字符串是不能手动编辑的,那么如果你真的想编辑的话,可以将其转换成 byte 的切片,然后再编辑
1 | var a = "hello" |
不过,当文本包含中文字符时,就需要转换成 rune 的切片
1 | var a = "你好" |
求长度
一般来说,直接 len(s) 即可
1 | var a = "hello" |
同样的,在有中文的场景下,需要先转换成 rune 的切片
1 | var a = "你好" |
相关函数
strings 包
| 函数 | 作用 |
|---|---|
| Count (s, substr string) int | 计算子串substr在字符串s中出现的次数 |
| Compare(a, b string) int | 比较字符串大小 |
| Contains (s, substr string) bool | 判断字符串s中是否包含子串substr |
| ContainsAny(s, chars string) bool | 判断字符串s中是否包含chars中的某个Unicode字符 |
| ContainsRune(s string, r rune) bool | 判断字符串s中是否包含rune型值为r的字符 |
| Index (s, substr string) int | 查找子串substr在字符串s中第一次出现的位置,如果找不到则返回 -1,如果substr为空,则返回 0 |
| LastIndex(s, substr string) int | 查找子串substr在字符串s中最后出现的位置 |
| IndexRune(s string, r rune) int | 查找rune型值为r的字符在字符串s中出现的起始位置 |
| IndexAny(s, chars string) int | 查找字符串chars中字符,在字符串s中出现的起始位置 |
| LastIndexAny(s, chars string) int | 查找字符串s中出现chars中字符的最后位置 |
| LastIndexByte(s string, c byte) int | 查找byte型字符c在字符串s中的位置 |
| SplitN(s, sep string, n int) []string | 以字符串sep为分隔符,将字符串s切分成n个子串,结果中不包含sep本身。如果sep为空则将s切分为 Unicode 字符列表,如果s中没有sep子串则整个s作为切片 []string 中的第一个元素返回。参数n表示最多切出几个子串,s超出切分大小时,超出部分不再切分。n超出切分子串个数时,返回实际切分子串数。如果n为 0,则返回 nil;如果n小于 0,则不限制切分个数,全部切分 |
| SplitAfterN(s, sep string, n int) []string | 以字符串sep为分隔符,将字符串s切分成n个子串,结果中包含sep本身。如果sep为空则将s切分为 Unicode 字符列表,如果s中没有sep子串则整个s作为切片 []string 中的第一个元素返回。参数n表示最多切出几个子串,s超出切分大小时,超出部分不再切分。n超出切分子串个数时,返回实际切分子串数。如果n为 0,则返回 nil;如果n小于 0,则不限制切分个数,全部切分 |
| Split(s, sep string) []string | 以字符串sep为分隔符,将s切分成多个子串,结果中不包含sep本身。如果sep为空,则将s切分成 Unicode 字符列表,如果s中没有sep子串,则将整个s作为 []string 的第一个元素返回 |
| SplitAfter(s, sep string) []string | 以字符串sep为分隔符,将s切分成多个子串,结果中包含sep本身。如果sep为空则将s切分为 Unicode 字符列表,如果s中没有sep子串则整个s作为切片 []string 中的第一个元素返回。 |
| Fields (s string) []string | 以连续的空白字符为分隔符,将s切分成多个子串,结果中不包含空白字符本身。空白字符有:\t, \n, \v, \f, \r, ‘’, U+0085 (NEL), U+00A0 (NBSP) 。如果s中只包含空白字符,则返回一个空切片 |
| FieldsFunc(s string, f func(rune) bool) []string | 以一个或多个满足函数f(rune)的字符为分隔符,将s切分成多个子串,结果中不包含分隔符本身。如果s中没有满足f(rune)的字符,则返回一个空切片 |
| Join (a []string, sep string) string | 以sep为拼接符,拼接切片a中的字符串 |
| HasPrefix (s, prefix string) bool | 判断字符串s是否以prefix字符串开头,是返回 true,否则返回 false |
| HasSuffix(s, suffix string) bool | 判断字符串s是否以suffix字符串结尾,是返回 true,否则返回 false |
| Map(f func(rune) rune, s string) string | 将字符串s中满足函数f(rune)的字符替换为f(rune)的返回值。如果f(rune)返回负数,则相应的字符将被删除 |
| Repeat(s string, count int) string | 返回字符串s重复count次数后的结果 |
| ToUpper(s string) string | 将字符串s中的小写字符转为大写 |
| ToLower(s string) string | 将字符串s中的大写字符转为小写 |
| ToTitle(s string) string | 将字符串s中的首个单词转为Title形式,大部分字符的Title格式就是Upper格式 |
| ToUpperSpecial(c unicode.SpecialCase, s string) string | 将字符串s中的所有字符修改为其大写格式,优先使用c中的规则进行转换 |
| ToLowerSpecial(c unicode.SpecialCase, s string) string | 将字符串s中的所有字符修改为其小写格式,优先使用c中的规则进行转换 |
| ToTitleSpecial(c unicode.SpecialCase, s string) string | 将字符串s中的所有字符修改为其Title格式,优先使用c中的规则进行转换 |
| Title(s string) string | 将字符串s中的所有单词的首字母修改为其Title格式(BUG: Title 规则不能正确处理 Unicode 标点符号) |
| TrimLeftFunc(s string, f func(rune) bool) string | 删除字符串s左边连续满足f(rune)的字符 |
| TrimRightFunc(s string, f func(rune) bool) string | 删除字符串s右边连续满足f(rune)的字符 |
| TrimFunc(s string, f func(rune) bool) string | 删除字符串s左右两边连续满足f(rune)的字符 |
| IndexFunc(s string, f func(rune) bool) int | 查找字符串s中第一个满足f(rune)的字符的字节位置,没有返回 -1 |
| LastIndexFunc(s string, f func(rune) bool) int | 查找字符串s中最后一个满足f(rune)的字符的字节位置,没有返回 -1 |
| Trim(s string, cutset string) string | 删除字符串s左右两边连续包含cutset的字符 |
| TrimLeft(s string, cutset string) string | 删除字符串s左边连续包含cutset的字符 |
| TrimRight(s string, cutset string) string | 删除字符串s右边连续包含cutset的字符 |
| TrimSpace(s string) string | 删除字符串s左右两边连续的空白字符 |
| TrimPrefix(s, prefix string) string | 删除字符串s 头部的prefix字符串 |
| TrimSuffix(s, suffix string) string | 删除字符串s 尾部的suffix字符串 |
| Replace(s, old, new string, n int) string | 替换字符串s中的old为new,如果old为空则在s中的每个字符间插入new包括首尾,n为替换次数, -1 时替换所有 |
| EqualFold(s, t string) bool | 忽略大小写比较字符串s和t,相同返回 true,反之返回 false |
byte 包
前面讲了有时需要将 string 转换成 []byte 以编辑,所以 byte 包也是字符串相关的
而其实 byte 包中的函数跟 strings 包中的是一模一样的,只是把里面的类型全变了而已,直接参考上表即可
除此之外,这个包里还多了 bytes.Reader 和 bytes.Buffer 两个对象
strconv 包
与字符串相关的类型转换都是通过 strconv 包实现的,下面仅包含常用的部分,详情可以见这篇
| 函数 | 作用 |
|---|---|
| IntSize | 获取程序运行的操作系统平台下 int 类型所占的位数 |
| Itoa(i int) string | 返回数字 i 所表示的字符串类型的十进制数 |
| FormatFloat(f float64, fmt byte, prec int, bitSize int) string | 将 64 位浮点型的数字转换为字符串,其中 fmt 表示格式(其值可以是 ‘b’、‘e’、‘f’ 或 ‘g’),prec 表示精度,bitSize 则使用 32 表示 float32,用 64 表示 float64 |
| Atoi(s string) (i int, err error) | 将字符串转换为 int 型 |
| ParseFloat(s string, bitSize int) (f float64, err error) | 将字符串转换为 float64 型 |
评论
GiscusTwikoo