Go基础之字符和字符串的处理

在Go语言中, 当我们尝试遍历一个字符串的时候

1
2
3
4
5
6
7
8
9
10
11
12
package main

import "fmt"

func main() {
s := "我是带😈emoji的字符串!"
fmt.Println(s)

for i, ch := range s {
fmt.Printf("%d %c\n", i, ch)
}
}

执行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
我是带😈emoji的字符串!
0 我
3 是
6 带
9 😈
13 e
14 m
15 o
16 j
17 i
18 的
21 字
24 符
27 串
30 !

每个i对应的都是一个字节, 结果中出现的0 3 6 9是对应了获取底层字节的索引码, 第二个字符的字节码之所以会从第3位开始取, 是因为第一个中文字符其实占用了三个字节, 所以下一个字需要从索引为3的字节开始读取

Go语言中, 有一种数据类型叫rune, 他是由一个int32类型构成的新的数据类型, 专门用来处理Go语言中的字符问题

下面的demo中, 我们使用强制类型转换来将字符串, 强制转换为rune类型

1
2
3
4
5
6
7
8
9
10
11
12
package main

import "fmt"

func main() {
s := "我是带😈emoji的字符串!"
fmt.Println(s)

for i, ch := range []rune(s) {
fmt.Printf("%d %c\n", i, ch)
}
}

执行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
我是带😈emoji的字符串!
0 我
1 是
2 带
3 😈
4 e
5 m
6 o
7 j
8 i
9 的
10 字
11 符
12 串
13 !

小结:

  • rune相当于Go语言中的char
  • 使用range遍历position, rune
  • 使用utf8.RuneCountInString来获得字符的长度
  • 使用len(s)来获得字节的长度, len([]rune(s))来获得字符的长度
  • 使用[]byte获得字节

使用strings包操作字符串

一下列出常用的函数, 更多使用方法和demo请参考官方文档: https://golang.org/pkg/strings/

Compare

func Compare(a, b string) int

Compare函数用来比较两个字符串, 返回值为int类型, 如果两个字符串相等, 返回0; 如果a>b返回1; a<b返回-1

1
2
3
4
5
6
7
8
9
10
11
12
package main

import (
"fmt"
"strings"
)

func main() {
fmt.Println(strings.Compare("a", "b"))
fmt.Println(strings.Compare("a", "a"))
fmt.Println(strings.Compare("b", "a"))
}

执行结果:

1
2
3
-1
0
1

Contains

func Contains(s, substr string) bool

Contains函数用来判断第二个参数的字符串是否是第一个参数字符串的子串, 返回值为bool类型

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import (
"fmt"
"strings"
)

func main() {
fmt.Println(strings.Contains("seafood", "foo"))
fmt.Println(strings.Contains("seafood", "bar"))
fmt.Println(strings.Contains("seafood", ""))
fmt.Println(strings.Contains("", ""))
}

执行结果:

1
2
3
4
true
false
true
true

Count

func Count(s, substr string) int

Count函数用来计算子串在s字符串中出现的次数

Fields

func Fields(s string) []string

Fields函数以空格为分隔符, 将字符串分割成slice

1
2
3
4
5
6
7
8
9
10
package main

import (
"fmt"
"strings"
)

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

执行结果:

1
Fields are: ["foo" "bar" "baz"]

Index

func Index(s, substr string) int

Index函数返回第一个substr在s中出现的位置, 如果没有找到, 将返回-1

1
2
3
4
5
6
7
8
9
10
11
package main

import (
"fmt"
"strings"
)

func main() {
fmt.Println(strings.Index("chicken", "ken"))
fmt.Println(strings.Index("chicken", "dmr"))
}

执行结果:

1
2
4
-1

Join

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

Join函数用来将slice以指定的字符拼接成字符串

1
2
3
4
5
6
7
8
9
10
11
package main

import (
"fmt"
"strings"
)

func main() {
s := []string{"foo", "bar", "baz"}
fmt.Println(strings.Join(s, ", "))
}

执行结果:

1
foo, bar, baz

LastIndex

func LastIndex(s, substr string) int

LastIndex函数用来查找在s中最后一次出现子串的位置

1
2
3
4
5
6
7
8
9
10
11
12
package main

import (
"fmt"
"strings"
)

func main() {
fmt.Println(strings.Index("go gopher", "go"))
fmt.Println(strings.LastIndex("go gopher", "go"))
fmt.Println(strings.LastIndex("go gopher", "rodent"))
}

执行结果:

1
2
3
0
3
-1

Repeat

func Repeat(s string, count int) string

Repeat函数返回以指定次数重复的字符(串)

1
2
3
4
5
6
7
8
9
10
package main

import (
"fmt"
"strings"
)

func main() {
fmt.Println("ba" + strings.Repeat("na", 2))
}

执行结果:

1
banana

Replace

func Replace(s, old, new string, n int) string

替换

Split

func Split(s, sep string) []string

将字符串以指定字符切割成slice

Title

func Title(s string) string

每个单词的首字符大写

ToLower

func ToLower(s string) string

转小写

ToUpper

func ToUpper(s string) string

转大写

Trim/TrimLeft/TrimRight

func Trim(s string, cutset string) string

去掉两边空格/去掉左边空格/去掉右边空格