[TOC] # 字符串处理 下面这些函数来自于string包 常用操作 ![](https://box.kancloud.cn/a1e1eeebb98b302502bac3e36ff38fea_693x254.png) ## Fields以连续的空白字符为分隔符 ~~~ // 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!"] } ~~~ ## contains包含子串 ~~~ func Contains(s, substr string) bool 功能: 字符串s中是否包含substr,返回bool值 ~~~ 例子 ~~~ func main() { fmt.Println(strings.Contains("abc", "a")) //true fmt.Println(strings.Contains("abc", "")) //true fmt.Println(strings.Contains("", "")) //true } ~~~ ## join按指定方式拼接 ~~~ func Join(a []string, seq string) string 功能: 字符串链接,把slice a通过sep链接起来 ~~~ 例子 ~~~ func main() { s := []string{"foo", "bar", "baz"} //foo, bar, baz fmt.Println(strings.Join(s, ", ")) } ~~~ ## index找位置 还有个LastIndex表示最后出现的位置 ~~~ func Index(s, sep string) int 功能: 在字符串s中查找sep所在的位置,返回位置值,找不到返回-1 ~~~ 例子 ~~~ func main() { //3 fmt.Println(strings.Index("chiken", "ken")) } ~~~ ## repeat重复多少次 ~~~ func Repeat(s string, count int) string 功能: 重复s字符串count次,最后返回重复的字符串 ~~~ 例子 ~~~ func main() { //banana fmt.Println("ba" + strings.Repeat("na", 2)) } ~~~ ## replace按指定替换 ~~~ fiunc Replace(s, old, new string, n int) string 功能: 在s字符串中,把old字符串替换为new字符串,n表示替换的次数,小于0表示全部替换 ~~~ 例子 ~~~ func main() { //ab1 efg 1cc fmt.Println(strings.Replace("abc efg ccc", "c", "1", 2)) } ~~~ ## split分割 ~~~ func Split(s, sep string) []string 功能: 把s字符串按照sep分割,返回slice ~~~ 例子 ~~~ func main() { //["a" "b" "c"] fmt.Printf("%q\n", strings.Split("a,b,c", ",")) //["" " is c"] fmt.Printf("%q\n", strings.Split("a is c", "a")) } ~~~ ## Trim头尾去除指定的串 ~~~ func Trim(s string, cutset string) string 功能: 在s字符串的头部和尾部去除cutset指定的字符串 ~~~ 例子 ~~~ func main() { //["aaa"] fmt.Printf("[%q]", strings.Trim(" !!!aaa!!! ", " !")) } ~~~ # 字符串转换 ## Append 将整数等转换为字符串后,添加到现有的字节数组中 ~~~ func main() { //字节数组 str := make([]byte, 0, 100) str = strconv.AppendBool(str, false) //以10进制的方式追加,参数10 str = strconv.AppendInt(str, 111, 10) str = strconv.AppendQuote(str, "abcde") str = strconv.AppendQuoteRune(str, '单') //false111"abcde"'单' //转为string打印 fmt.Println(string(str)) } ~~~ ## Format Format系列函数把其他类型的转换为字符串 例子 ~~~ a := strconv.FormatBool(false) //10进制 b := strconv.FormatInt(1234, 10) c := strconv.FormatUint(123444, 10) //整形转字符串 d := strconv.Itoa(1234) //false 1234 123444 1234 fmt.Println(a, b, c, d) ~~~ ## parse parse系列函数把字符串转换为其他类型 ~~~ //字符串转其他类型 var flag bool var err error flag, err = strconv.ParseBool("true") if err == nil { //没有错误 fmt.Println("flag = ", flag) } else { fmt.Println("err = ", err) } ~~~ ## Atoi ~~~ func main() { //_表示丢弃 a, _ := strconv.Atoi("567") fmt.Println(a) } ~~~ # 和切片转换 长度是字节的长度 字符串底层是一个byte数组,所以可以和`[]byte`类型互相转换 字符串是不可以修改的 ~~~ var str = "hello你好" fmt.Printf("str[0]=%c, len(str)=%d\n", str[0], len(str)) for index, val := range str { fmt.Println(index, val) } //str['0'] = '1' 错误不能修改 var byteSlice []byte byteSlice = []byte(str) byteSlice[0] = '0' str = string(byteSlice) fmt.Println(str) ~~~ 输出 ~~~ str[0]=h, len(str)=11 0 104 1 101 2 108 3 108 4 111 5 20320 8 22909 0ello你好 ~~~ # 字节长度和字符长度 rune是字符类型 ~~~ var str = "hello你好" //字节数组 var rune []byte rune = []byte(str) //11, 11 fmt.Println(len(str), len(rune)) var str = "hello你好" //rune是字符类型 var byteSlice []rune byteSlice = []rune(str) //11, 7 fmt.Println(len(str), len(byteSlice)) ~~~ # string和int互相转换 * string转成int: ~~~ int, err := strconv.Atoi(string) ~~~ * string转成int64: ~~~ int64, err := strconv.ParseInt(string, 10, 64) ~~~ * int转成string: ~~~ string := strconv.Itoa(int) ~~~ * int64转成string: ~~~ string := strconv.FormatInt(int64,10) ~~~ * string 转 int32 ~~~ i32,err := strconv.ParseInt(str,10,32) if err == nil {   fmt.Printf("i32: %v\\n", int32(i32)) } ~~~ * int到int64 ~~~ int64_ := int64(1234) ~~~ # string和float float32 float64 * float到string ~~~ string := strconv.FormatFloat(float32,'E',-1,32) string := strconv.FormatFloat(float64,'E',-1,64) // 'b' (-ddddp±ddd,二进制指数) // 'e' (-d.dddde±dd,十进制指数) // 'E' (-d.ddddE±dd,十进制指数) // 'f' (-ddd.dddd,没有指数) // 'g' ('e':大指数,'f':其它情况) // 'G' ('E':大指数,'f':其它情况) ~~~ * string到float64 ~~~ float,err := strconv.ParseFloat(string,64) ~~~ * string到float32 ~~~ float,err := strconv.ParseFloat(string,32) ~~~ # string到time ~~~ day,_ := time.Parse("2006-01-02", "2017-11-14") month := time.Unix(day.Unix(), 0).Format("2006-01") //返回2017-11 ~~~