go字符串函数

52 阅读6分钟

字符串和切片的转换

Go语言中,字符串是通过UTF-8编码实现的。表现形式是 []byte 切片。

例子

s1 := "ab测试"

b1 := []byte(s1)

fmt.Println(s1, b1)

b2 := []byte{97, 98, 230, 181, 139, 232, 175, 149}

s2 := string(b2)

fmt.Println(s2, b2)

string 和 []rune 之间的转换,底层会有 utf8编码 转换成unicode码点 的转换。

s1 := "ab测试"

r1 := []rune(s1)

fmt.Println(s1, r1)

r2 := []rune{97, 98, 27979, 35797}

s2 := string(r2)

fmt.Println(s2, r2)

数字转换为字符串。会把数字当初unicode码点,找到相应的字符,存成utf8编码

num1 := 27979

s1 := string(num1)

fmt.Println(s1, num1)

s2 := "测"

num2 := rune(r2) //错误,字符串不能转换成数字。

string类型是值类型。转换的过程,底层实际拷贝了一份新的数据,所以对切片内容进行更改,不会影响字符串。

s1 := "ab测试"

b1 := []byte(s1)

fmt.Println(s1, b1)

b1[0] = 99

fmt.Println(s1, b1, string(b1))

● string(整数序列),强制类型转换成一个序列。 如果是byte类型,直接按utf8存储。

如果是 rune 类型,对每个rune类型查找 unicode码 点,转换成utf8 然后在存储

字符串常用操纵

strings包中有很多关于字符串操作的方法。

字符串是字面常量,是不可以修改的。很多操作都是返回新的字符串

  • 字符串拼接

s1 := "abc"

s2 := "测试"

s := s1 + s2 //使用连接符拼接两个字符串

fmt.Println(s)

s = fmt.Sprintf("%s%s", s1, s2) //使用格式化字输出,拼接字符串

fmt.Println(s)

s = strings.Join([]string{s1, s2}, "") //使用strings包提供的join函数

fmt.Println(s)

//需要大量字符串拼接时候,需要使用 strings.Builder

var strBuilder strings.Builder

strBuilder.WriteByte(97)

strBuilder.Write([]byte{98, 99})

strBuilder.WriteRune(28979)

strBuilder.WriteString("试")

fmt.Println(strBuilder.String())

  • 字符串查找
  1. func Index(s, substr string) int

s是要搜索的字符串,substr是要查找的子串。该函数会返回子串substrs中首次出现的位置的索引值,如果找不到,则返回-1

  1. func LastIndex(s, substr string) int

s是要搜索的字符串,substr是要查找的子串。该函数会返回子串substrs中最后出现的位置的索引值,如果找不到,则返回-1

  1. func IndexByte(s string, c byte) int

s是要搜索的字符串,c 是要查找的字符。该函数会返回字符cs中第一次出现的位置的索引值,如果找不到,则返回-1

//unicode码值r在s中第一次出现的位置,不存在则返回-1。

  1. func IndexRune(s string, r rune) int

//字符串chars中的任一utf-8码值在s中第一次出现的位置,如果不存在或者chars为空字符串则返回-1。

  1. func IndexAny(s, chars string) int

//字符串chars中的任一utf-8码值在s中最后一次出现的位置,如不存在或者chars为空字符串则返回-1。

  1. func LastIndexAny(s, chars string) int

//s中第一个满足函数f的位置i(该处的utf-8码值r满足f(r)==true),不存在则返回-1。

  1. func IndexFunc(s string, f func(rune) bool) int

f := func(c rune) bool {

return unicode.Is(unicode.Han, c)

}

fmt.Println(strings.IndexFunc("Hello, 世界", f)) //7

fmt.Println(strings.IndexFunc("Hello, world", f))//-1

//s中最后一个满足函数f的unicode码值的位置i,不存在则返回-1。

  1. func LastIndexFunc(s string, f func(rune) bool) int
  1. Contains方法本质上是 index方法,只是返回bool值,方便使用bool值使用。

//返回字符串s中有几个不重复的substr 子串。如果子串为空,则返回字符串s。rune的个数+1.

  1. func Count(s, substr string) int

fmt.Println(strings.Count("cheese", "e")) //3

fmt.Println(strings.Count("abc测试", "")) //6

转大小写

//返回将所有字母都转为对应的小写版本的拷贝。

func ToLower(s string) string

//返回将所有字母都转为对应的大写版本的拷贝。

func ToUpper(s string) string

前后缀

//判断s是否有前缀字符串prefix。

func HasPrefix(s, prefix string) bool

//判断s是否有后缀字符串suffix。

func HasSuffix(s, suffix string) bool

去除前后空格

//返回将s前后端所有空白(unicode.IsSpace指定)都去掉的字符串。

func TrimSpace(s string) string

//返回将s前端所有cutset包含的utf-8码值都去掉的字符串。

func TrimLeft(s string, cutset string) string

//返回将s最后所有cutset包含的utf-8码值都去掉的字符串。

func TrimRight(s string, cutset string) string

//返回将s前后端所有cutset包含的utf-8码值都去掉的字符串。

func Trim(s string, cutset string) string

//返回将s前端所有满足f的unicode码值都去掉的字符串。

func TrimLeftFunc(s string, f func(rune) bool) string

//返回将s后端所有满足f的unicode码值都去掉的字符串。

func TrimRightFunc(s string, f func(rune) bool) string

//返回将s前后端所有满足f的unicode码值都去掉的字符串。

func TrimFunc(s string, f func(rune) bool) string

//返回去除s前缀prefix的字符串。

func TrimPrefix(s, prefix string) string

//返回去除s后缀suffix 的字符串。

func TrimSuffix(s, suffix string) string

字符串分割

//分割是按rune分割的。分割后,返回的是string切片

func Split(s, sep string) []string

fmt.Printf("%q\n", strings.Split("a,b,c", ",")) //["a" "b" "c"]

fmt.Printf("%q\n", strings.Split("a man a plan a canal panama", "a ")) ["" "man " "plan " "canal panama"]

fmt.Printf("%q\n", strings.Split(" xyz ", "")) //[" " "x" "y" "z" " "]

fmt.Printf("%q\n", strings.Split("", "Bernardo O'Higgins")) //[""]

fmt.Printf("%q", strings.Split("测试分割,分割测试", "分")) //["测试" "割," "割测试"]

fmt.Printf("%q", strings.Split("测试分割,分割测试", "")) //["测" "试" "分" "割" "," "分" "割" "测" "试"]

//和split一样。只是切掉的字符,会保留

func SplitAfter(s, sep string) []string

//和split一样。只是指定切割份数

//n > 0 : 返回的切片最多n个子字符串;最后一个子字符串包含未进行切割的部分。

//n == 0: 返回 空切片,也就是string切片的零值,相当于 var tmp []string

//n < 0 : 返回所有的子字符串组成的切片

func SplitN(s, sep string, n int) []string

//strings.Cut函数用于在字符串中查找子串,并在找到子串后将其分割成两部分:before和after

//,同时返回一个布尔值表示是否找到子串

func Cut(s, sep string)(before, after string, found bool)

字符串替换

//返回将s中前n个不重叠old子串都替换为new的新字符串,如果n<0会替换所有old子串。

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

fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2)) //oinky oinky oink

//如果n<0,效果等于ReplaceAll函数

fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1)) //moo moo moo

字符串遍历

//将s的每一个unicode码值传入函数mapping(r)中,mapping(r)的每一个返回值组成新的字符串。

// 如果mapping返回一个负值,将会丢弃该码值而不会被替换。(返回值中对应位置将没有码值)

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

案例:

把一个字符串 "abc测试DEF" ,的大写字母,变成小写字母。去除里边不是字母的字符

myUpCase := func(r rune) rune {

switch {

case r >= 'A' && r <= 'Z':

return r + 32

case r >= 'a' && r <= 'z':

return r

default:

return -1

}

}

fmt.Println(strings.Map(myUpCase, "abc测试DEF"))