Day03-Go语言字符串操作 | 青训营笔记

98 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

字符串操作——strings库

strings 包提供了很多操作字符串的简单函数,通常一般的字符串操作需求都可以在这个包中找到。我们常见的字符串常见操作有:

  • 字符串长度;
  • 求子串;
  • 是否存在某个字符或子串;
  • 子串出现的次数(字符串匹配);
  • 字符串分割(切分)为[]string;
  • 字符串是否有某个前缀或后缀;
  • 字符或子串在字符串中首次出现的位置或最后一次出现的位置;
  • 字符串重复几次;
  • 字符串中子串替换;
  • 大小写转换;
  • ......

1、字符串比较

Compare 函数,用于比较两个字符串的大小,如果两个字符串相等,返回为 0。如果 a 小于 b ,返回 -1 ,反之返回 1 ,但一般直接使用 == != > < >= <= 等一系列运算符会更加直观:func Compare(a, b string) int

EqualFold 函数,计算 s 与 t 忽略字母大小写后是否相等:func EqualFold(s, t string) bool

2、是否存在某个字符或子串

Contains函数:子串 substr 在 s 中,返回 true

func Contains(s, substr string) bool

ContainsAny函数:chars 中任何一个 Unicode 代码点在 s 中,返回 true

func ContainsAny(s, chars string) bool

ContainsRune函数:Unicode 代码点 r 在 s 中,返回 true

func ContainsRune(s string, r rune) bool

3、子串出现次数——字符串匹配

Count 函数,当 sep 为空时,Count的返回值是:utf8.RuneCountInString(s) + 1:

func Count(s, sep string) int

fmt.Println(strings.Count("cheese", "e"))
fmt.Println(len("谷歌中国"))
fmt.Println(strings.Count("谷歌中国", ""))

//输出:
3
12
5

4、字符串分割为[]string

Fields函数:用一个或多个连续的空格分隔字符串 s,返回子字符串的数组(slice)。如果字符串 s 只包含空格,则返回空列表([]string 的长度为 0):

fmt.Printf("Fields are: %q", strings.Fields(" foo bar baz "))

输出结果:
Fields are: ["foo" "bar" "baz"]

Split、SplitAfter、SplitN、SplitAfterN函数都是通过一个同一个内部函数来实现的。这四个函数都是通过 sep 进行分割,返回[]string。如果 sep 为空,相当于分成一个个的 UTF-8 字符,如Split("abc","") ,得到的是[a b c],它们的函数签名及其实现:

func Split(s, sep string) []string { return genSplit(s, sep, 0, -1) }

func SplitAfter(s, sep string) []string { return genSplit(s, sep, len(sep), -1) }

func SplitN(s, sep string, n int) []string { return genSplit(s, sep, 0, n) }

func SplitAfterN(s, sep string, n int) []string { return genSplit(s, sep, len(sep), n) }

Split、SplitAfter的区别:Split 会将 s 中的 sep 去掉,而 SplitAfter 会保留 sep

5、字符串是否有某个前缀或后缀

HasPrefixHasSuffix函数,源码如下:

// s 中是否以 prefix 开始
func HasPrefix(s, prefix string) bool {
    return len(s) >= len(prefix) && s[0:len(prefix)] == prefix
}

// s 中是否以 suffix 结尾
func HasSuffix(s, suffix string) bool {
return len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix
}

如果 prefix 或 suffix 为 “” , 返回值总是 true。

6、字符或子串在字符串中出现的位置

一系列函数与该功能有关: `

// 在 s 中查找 sep 的第一次出现,返回第一次出现的索引
func Index(s, sep string) int

// 在 s 中查找字节 c 的第一次出现,返回第一次出现的索引
func IndexByte(s string, c byte) int

// chars 中任何一个 Unicode 代码点在 s 中首次出现的位置
func IndexAny(s, chars string) int

// 查找字符 c 在 s 中第一次出现的位置,其中 c 满足 f(c) 返回 true
func IndexFunc(s string, f func(rune) bool) int

// Unicode 代码点 r 在 s 中第一次出现的位置
func IndexRune(s string, r rune) int

// 有三个对应的查找最后一次出现的位置
func LastIndex(s, sep string) int
func LastIndexByte(s string, c byte) int
func LastIndexAny(s, chars string) int
func LastIndexFunc(s string, f func(rune) bool) int

7、字符串 JOIN 操作

将字符串数组(或 slice)连接起来可以通过 Join 实现,函数签名如下:

func Join(a []string, sep string) string

简单使用示例:

fmt.Println(Join([]string{"name=xxx", "age=xx"}, "&"))

//输出结果:
name=xxx&age=xx