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