Golang常用包之一:strings(一)

1,131 阅读5分钟

1. Count 计算字符串 sep 在 s 中的非重叠个数

如果 sep 为空字符串,则返回 s 中的字符(非字节)个数 + 1

func Count(s, chars string) int
func main() {
   a := "你好呀 Golang !!!!"
   n := strings.Count(a, "!!")
   n2 := strings.Count(a, "") 
   fmt.Println(n, n2, len(a), utf8.RuneCountInString(a), len([]rune(a))) // 2  16  21  15  15
}

2. Contains 判断字符串 s 中是否包含子串 substr

如果 substr 为空,则返回 true

func Contains(s, substr string) bool
func main() {
   a := "你好呀 Golang !!!!"
   fmt.Println(strings.Contains(a, "你好")) // true
   fmt.Println(strings.Contains(a, "!!")) // true
   fmt.Println(strings.Contains(a, "")) // true
   fmt.Println(strings.Contains(a, "ac")) // false
}

3. ContainsAny 判断字符串 s 中是否包含 chars 中的任何一个字符

如果 substr 为空,则返回 false

func ContainsAny(s, chars string) bool
func main() {
   a := "你好呀 Golang !!!!"
   fmt.Println(strings.ContainsAny(a, "你好")) // true
   fmt.Println(strings.ContainsAny(a, "你坏")) // true
   fmt.Println(strings.ContainsAny(a, "我坏")) // false
   fmt.Println(strings.ContainsAny(a, "")) // false
}

4. ContainsRune 判断字符串 s 中是否包含字符 r

func ContainsRune(s string, r rune) bool

rune 不允许为空

func main() {
   // rune = int32  byte = uint8
   a := "你好呀 Golang !!!!"
   b := strings.ContainsRune(a, '!') // true
   c := strings.ContainsRune(a, '呀') // true
   d := strings.ContainsRune(a, 0) // false
   e := strings.ContainsRune(a, 97) // true
   fmt.Println(b, c, d, e)
}

5. Index 返回子串 sep 在字符串 s 中第一次出现的位置

func Index(s, sep string) int

如果找不到,则返回 -1,如果 sep 为空,则返回 0。

func main() {
   // 中文占3个长度,英文及符号占1个长度
   a := "你好呀 Golang !!!!"
   b := strings.Index(a, " ") //9
   c := strings.Index(a, "好") //3
   d := strings.Index(a, "")  //0
   fmt.Println(b, c, d)
}

6. LastIndex 返回子串 sep 在字符串 s 中最后一次出现的位置

func LastIndex(s, sep string) int

如果找不到,则返回 -1,如果 sep 为空,则返回 0。

func main() {
   // 中文占3个长度,英文及符号占1个长度
   a := "你好呀 Golang !!!!"
   b := strings.LastIndex(a, " ") // 16
   c := strings.LastIndex(a, "好")     //3
   d := strings.LastIndex(a, "")      //0
   fmt.Println(b, c, d)
}

7. IndexRune 返回字符 r 在字符串 s 中第一次出现的位置

func IndexRune(s string, r rune) int

如果找不到,则返回 -1

func main() {
   // 中文占3个长度,英文及符号占1个长度
   a := "你好呀 Golang !!!!"
   b := strings.IndexRune(a, 97)  // 13
   c := strings.IndexRune(a, 0)   // -1
   d := strings.IndexRune(a, 'o') // 11
   fmt.Println(b, c, d)
}

8. IndexAny 返回字符串 chars 中的任何一个字符在字符串 s 中第一次出现的位置

func IndexAny(s, chars string) int

如果找不到,则返回 -1,如果 chars 为空,则返回 -1 LastIndexAny 同理

func main() {
   // 中文占3个长度,英文及符号占1个长度
   a := "你好呀 Golang !!!!"
   b := strings.IndexAny(a, "pyth") // 13
   c := strings.IndexAny(a, "我不好")    // -1
   d := strings.IndexAny(a, "嗯呐")     // 11
   fmt.Println(b, c, d)
}

9. SplitN 以 sep 为分隔符,将 s 切分成多个子串,结果中不包含 sep 本身

如果 sep 为空,则将 s 切分成 Unicode 字符列表。
如果 s 中没有 sep 子串,则将整个 s 作为 []string 的第一个元素返回
参数 n 表示最多切分出几个子串,超出的部分将不再切分。
如果 n 为 0,则返回 nil,如果 n 小于 0,则不限制切分个数,全部切分

func SplitN(s, sep string, n int) []string
func main() {
	s := "Hello, 世界! Hello!"
	ss := strings.SplitN(s, " ", 2)
	fmt.Printf("%q\n", ss) // ["Hello," "世界! Hello!"]
	ss = strings.SplitN(s, " ", -1)
	fmt.Printf("%q\n", ss) // ["Hello," "世界!" "Hello!"]
	ss = strings.SplitN(s, "", 3)
	fmt.Printf("%q\n", ss) // ["H" "e" "llo, 世界! Hello!"]
}

10. SplitAfterN 以 sep 为分隔符,将 s 切分成多个子串,结果中包含 sep 本身

如果 sep 为空,则将 s 切分成 Unicode 字符列表。
如果 s 中没有 sep 子串,则将整个 s 作为 []string 的第一个元素返回
参数 n 表示最多切分出几个子串,超出的部分将不再切分。
如果 n 为 0,则返回 nil,如果 n 小于 0,则不限制切分个数,全部切分

func SplitAfterN(s, sep string, n int) []string
func main() {
	s := "Hello, 世界! Hello!"
	ss := strings.SplitAfterN(s, " ", 2)
	fmt.Printf("%q\n", ss) // ["Hello, " "世界! Hello!"]
	ss = strings.SplitAfterN(s, " ", -1)
	fmt.Printf("%q\n", ss) // ["Hello, " "世界! " "Hello!"]
	ss = strings.SplitAfterN(s, "", 3)
	fmt.Printf("%q\n", ss) // ["H" "e" "llo, 世界! Hello!"]
}

11. Split 以 sep 为分隔符,将 s 切分成多个子切片,结果中不包含 sep 本身

如果 sep 为空,则将 s 切分成 Unicode 字符列表。
如果 s 中没有 sep 子串,则将整个 s 作为 []string 的第一个元素返回

func Split(s, sep string) []string
func main() {
   s := "Hello, 世界! Hello!"
   ss := strings.Split(s, " ")
   fmt.Printf("%q\n", ss) // ["Hello," "世界!" "Hello!"]
   ss = strings.Split(s, ", ")
   fmt.Printf("%q\n", ss) // ["Hello" "世界! Hello!"]
   ss = strings.Split(s, "")
   fmt.Printf("%q\n", ss) // ["H" "e" "l" "l" "o" "," " " "世" "界" "!" " " "H" "e" "l" "l" "o" "!"]
}

12. SplitAfter 以 sep 为分隔符,将 s 切分成多个子切片,结果中包含 sep 本身

如果 sep 为空,则将 s 切分成 Unicode 字符列表。
如果 s 中没有 sep 子串,则将整个 s 作为 []string 的第一个元素返回

func SplitAfter(s, sep string) []string
func main() {
	s := "Hello, 世界! Hello!"
	ss := strings.SplitAfter(s, " ")
	fmt.Printf("%q\n", ss) // ["Hello, " "世界! " "Hello!"]
	ss = strings.SplitAfter(s, ", ")
	fmt.Printf("%q\n", ss) // ["Hello, " "世界! Hello!"]
	ss = strings.SplitAfter(s, "")
	fmt.Printf("%q\n", ss) // 单个字符列表
}

13. Fields 以连续的空白字符为分隔符,将 s 切分成多个子串,结果中不包含空白字符本身

空白字符有:\t, \n, \v, \f, \r, ' ', U+0085 (NEL), U+00A0 (NBSP)
如果 s 中只包含空白字符,则返回一个空列表
func Fields(s string) []string

func main() {
	s := "Hello, 世界! Hello!"
	ss := strings.Fields(s)
	fmt.Printf("%q\n", ss) // ["Hello," "世界!" "Hello!"]
}

14. FieldsFunc 以一个或多个满足 f(rune) 的字符为分隔符

将 s 切分成多个子串,结果中不包含分隔符本身。
如果 s 中没有满足 f(rune) 的字符,则返回一个空列表。
#####func FieldsFunc(s string, f func(rune) bool) []string

func isSlash(r rune) bool {
	return r == '\' || r == '/'
}

func main() {
	s := "C:\Windows\System32\FileName"
	ss := strings.FieldsFunc(s, isSlash)
	fmt.Printf("%q\n", ss) // ["C:" "Windows" "System32" "FileName"]
}

15. Join 将 a 中的子串连接成一个单独的字符串,子串之间用 sep 分隔

func Join(a []string, sep string) string
func main() {
   var lis []string
   lis = []string{"name", "age", "sex"}
   ret := strings.Join(lis, "|")
   fmt.Println(ret)
}
// name|age|sex

16. HasPrefix 判断字符串 s 是否以 prefix 开头

func HasPrefix(s, prefix string) bool
func main() {
   s := "Golang世界真美妙"
   b := strings.HasPrefix(s, "Golang") // true
   c := strings.HasPrefix(s, "lang")   // false
   fmt.Println(b, c)
}

17. HasSuffix 判断字符串 s 是否以 suffix 结尾

func HasSuffix(s, suffix string) bool
func main() {
   s := "Golang世界真美妙"
   b := strings.HasSuffix(s, "美妙")     // true
   c := strings.HasSuffix(s, "Golang") // false
   fmt.Println(b, c)
}

18. Map 将 s 中满足 mapping(rune) 的字符替换为 mapping(rune) 的返回值

如果 mapping(rune) 返回负数,则相应的字符将被删除。

func Map(mapping func(rune) rune, s string) string

场景: 用于字符的批量替换

func f(r rune) rune {
   if r == 'o' {
      // 如果次数返回负数 就代表满足条件的字符就会在字符串中删除掉
      return -1
   }
   return r
}
func main() {
   s := "Golang世界真美妙"
   ms := strings.Map(f, s)
   fmt.Println(ms)
}

19. Repeat 将 count 个字符串 s 连接成一个新的字符串

func Repeat(s string, count int) string
func main() {
	s := "Hello!"
	rs := strings.Repeat(s, 3)
	fmt.Printf("%q\n", rs) // "Hello!Hello!Hello!"
}