字符串和切片的转换
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())
- 字符串查找
- func Index(s, substr string) int
s是要搜索的字符串,substr是要查找的子串。该函数会返回子串substr在s中首次出现的位置的索引值,如果找不到,则返回-1
- func LastIndex(s, substr string) int
s是要搜索的字符串,substr是要查找的子串。该函数会返回子串substr在s中最后出现的位置的索引值,如果找不到,则返回-1
- func IndexByte(s string, c byte) int
s是要搜索的字符串,c 是要查找的字符。该函数会返回字符c在s中第一次出现的位置的索引值,如果找不到,则返回-1
//unicode码值r在s中第一次出现的位置,不存在则返回-1。
- func IndexRune(s string, r rune) int
//字符串chars中的任一utf-8码值在s中第一次出现的位置,如果不存在或者chars为空字符串则返回-1。
- func IndexAny(s, chars string) int
//字符串chars中的任一utf-8码值在s中最后一次出现的位置,如不存在或者chars为空字符串则返回-1。
- func LastIndexAny(s, chars string) int
//s中第一个满足函数f的位置i(该处的utf-8码值r满足f(r)==true),不存在则返回-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。
- func LastIndexFunc(s string, f func(rune) bool) int
- Contains方法本质上是 index方法,只是返回bool值,方便使用bool值使用。
//返回字符串s中有几个不重复的substr 子串。如果子串为空,则返回字符串s。rune的个数+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"))