定义

有的人说 Golang = C + Python ,这句话不假,像函数、数值变量的类型等都能看见 C 的影子,而 Go 中最像 Python 的地方就是字符串了

1
s := "hello, world"

访问

这点和 Python 一模一样

使用索引

1
fmt.Println(s[0], s[7]) // "104 119" ('h' and 'w')

使用切片

1
2
3
4
fmt.Println(s[0:5]) // "hello"
fmt.Println(s[:5]) // "hello"
fmt.Println(s[7:]) // "world"
fmt.Println(s[:]) // "hello, world"

运算符

使用 + 可以连接两个字符串

1
fmt.Println("goodbye" + s[5:]) // "goodbye, world"

比较大小也与 Python 中的相同

1
println("123" > "120000") // True

编辑

和 Python 一样,字符串是不能手动编辑的,那么如果你真的想编辑的话,可以将其转换成 byte 的切片,然后再编辑

1
2
3
4
5
var a = "hello"
var b = []byte(a)
b[0] = 'H'
a = string(b)
fmt.Println(a) // "Hello"

不过,当文本包含中文字符时,就需要转换成 rune 的切片

1
2
3
4
5
var a = "你好"
var b = []rune(a)
b[0] = '您'
a = string(b)
fmt.Println(a) // "您好"

求长度

一般来说,直接 len(s) 即可

1
2
var a = "hello"
fmt.Println(len(a)) // 5

同样的,在有中文的场景下,需要先转换成 rune 的切片

1
2
3
var a = "你好"
fmt.Println(len(a)) // 6
fmt.Println(len([]rune(a))) // 2

相关函数

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中的oldnew,如果old为空则在s中的每个字符间插入new包括首尾,n为替换次数, -1 时替换所有
EqualFold(s, t string) bool 忽略大小写比较字符串st,相同返回 true,反之返回 false

byte

前面讲了有时需要将 string 转换成 []byte 以编辑,所以 byte 包也是字符串相关的

而其实 byte 包中的函数跟 strings 包中的是一模一样的,只是把里面的类型全变了而已,直接参考上表即可

除此之外,这个包里还多了 bytes.Readerbytes.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 型