字符与字符串 Go 内置两种字符类型:
一种是 byte 的字节类类型(byte 是 uint 的别名) 
另一种是表示 Unicode 编码的字符 rune。rune 在 Go 内部是 int32类型的别名,占用 4 个字节。 
 
Go 语言默认的字符编码是 UTF-8 类型,如果需要特殊的编码转换,则使用 Unicode/UTF-8 标准包。
Go 语言将字符串作为一种原生的基本数据类型,字符串初始化可以使用 字符串字面量 。
字符串是不可变值类型,内部用指针指向 UTF-8 字节数组
默认值是空字符串 ""。 
可以用索引号访问字符串的字节,如 str[i]。 
不能用序号获取字节元素指针,如 &str[i] 是非法的。 
不可变类型,无法修改字节数组的值。 
字节数组尾部不包含 NULL。 
 
字符串类型底层是一个二维的数据结构,一个是指针指向字节数组的起点,另一个是长度。例如:
1 2 3 4 type  stringStruct struct  {    str unsafe.Pointer     len  int  } 
字符串声明 所有类型声明都是一样的。
显示完整声明
短类型声明::= 只能出现在函数内(包括方法内),只是 Go 编译器自动进行数据类型推断。
Go 支持多个类型变量同时声明并赋值,但不建议这么使用,不易阅读
1 2 a := "hello"  a, b := "hello" , "world"  
 
字符串处理 使用索引访问字节 字符串是常量,可以通过类似数组的索引访问其字节单元,但是不能修改某个字节的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package  mainimport  "fmt" var  a = "hello,world" var  b = "hello,世界!" func  main () 	 	b := a[0 ] 	fmt.Println(b)             	fmt.Println(a[1 ])          	fmt.Println(string (a[2 ]))  	c := "abc"  	fmt.Println(c[0 ] == '\x61' , c[1 ] == 'b' )  } 
不做转义处理 使用 `  定义不做转义处理的原始字符串,支持跨行
1 2 3 4 5 6 7 8 9 package  mainimport  "fmt" func  main () 	str2 := `ab\r\n\x00c`  	fmt.Println(str2) } 
连符串跨行连接 连符串使用 + 符号来连接,跨行连接的 + 必须在上一行的结尾,否则会报错。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package  mainimport  "fmt" func  main () 	str3 := "hello, "  +	"world"  	fmt.Println(str3) 	str4 := "hello, "  +	 		"world"  	fmt.Println(str4) } 
获取字符串子串 因字符串底层是个二维的数据结构,所以可以使用索引  和 长度(单位:字节)  来获取字符串的子串。
**注意:**中文是 三个字节  表示一个汉字,如果长度不是 3 的整数倍就会显示乱码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package  mainimport  "fmt" func  main () 	str5 := "hello, world"  	fmt.Println(str5[0 :4 ])  	fmt.Println(str5[1 :])  	fmt.Println(str5[:4 ])           str6 := "中国人民共和国"  	fmt.Println(str6[0 :3 ]) 	fmt.Println(str6[3 :]) 	fmt.Println(str6[:6 ]) } 
单引号表示Unicode Go 源码采用的是 UTF-8 的编码方式,UTF-8 的字符占用的字节数可以有 1~4 个字节,Rune  字符常量使用 ''将其括住。
支持 \uFFFF、\U7FFFFFFF、\xFF 格式, 对应 rune 类型,UCS-4。
1 2 3 4 5 6 7 8 9 10 11 12 package  mainimport  "fmt" func  main () 	fmt.Printf("%T\n" , 'a' ) 	var  str7, str8 rune  = '\u6211' , '们'   	fmt.Println(str7 == '我' , string (str8) == "\xe4\xbb\xac" ) } 
修改字符串 要修改字符串,可先将其转换成 []rune 或 []byte
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package  mainimport  "fmt" func  main () 	str9 := "hello"  	str10 := []byte (str9)  	str10[1 ] = 'H'  	fmt.Println(string (str10)) 	str11 := "电脑"  	str12 := []rune (str11)  	str12[1 ] = '话'  	fmt.Println(string (str12)) } 
循环遍历字符串 有两种方式,但都是基于 for 循环。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package  mainimport  "fmt" func  main () 	str13 := "hello,word"  	for  i, v := range  str13 {   		fmt.Println(i, string (v)) 	} 	fmt.Println("................................." ) 	for  i := 0 ; i < len (str13); i++ { 		fmt.Println(i, string (str13[i])) 	} } 
strings处理 strings 是 Go 自带的字符串工具类。
判断开始字符串 strings.HasPrefix(src, dest),返回 bool 值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package  mainimport  (	"fmt"  	"strings"  ) func  main () 	str := "hello,world"  	res0 := strings.HasPrefix(str, "http" ) 	res01 := strings.HasPrefix(str, "hello" ) 	fmt.Println(res0)  	fmt.Println(res01)  } 
判断结尾字符串 strings.HasPrefix(src, dest),返回 bool值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package  mainimport  (	"fmt"  	"strings"  ) func  main () 	str := "hello,world"      res2 := strings.HasSuffix(str, "world" ) 	res3 := strings.HasSuffix(str, "word" ) 	fmt.Println("res2 =" , res2) 	fmt.Println("res3 =" , res3) } 
判断字符首次出现的索引位 strings.Index(src, dest),返回 int值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package  mainimport  (	"fmt"  	"strings"  ) func  main () 	str := "hello,world"  	num1 := strings.Index(str, "l" ) 	num2 := strings.Index(str, "o" ) 	num3 := strings.Index(str, "i" ) 	fmt.Println("num1 =" , num1)  	fmt.Println("num2 =" , num2)   	fmt.Println("num3 =" , num3)   } 
判断字符最后出现的索引位 strings.LastIndex(src, dest),返回 int值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package  mainimport  (	"fmt"  	"strings"  ) func  main () 	str := "hello,world"  	num4 := strings.LastIndex(str, "l" ) 	num5 := strings.LastIndex(str, "o" ) 	num6 := strings.LastIndex(str, "i" ) 	fmt.Println("num4 =" , num4)  	fmt.Println("num5 =" , num5)  	fmt.Println("num6 =" , num6)  } 
字符串替换 
Replace(s, old, new string, n int) string:指定替换次数ReplaceAll(s, old, new string) string:替换所有,实际调上面的方法,n 传的是 -1,表示不限制次数。 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package  mainimport  (	"fmt"  	"strings"  ) func  main () 	str1 := "hello,world, world"  	res5 := strings.Replace(str1, "h" , "H" , 1 ) 	res6 := strings.Replace(str1, "o" , "O" , 2 ) 	res7 := strings.ReplaceAll(str1, "l" , "L" ) 	fmt.Println("res5 =" , res5) 	fmt.Println("res6 =" , res6) 	fmt.Println("res7 =" , res7) } 
求重复出现的次数 Count(s, substr string) int:返回整数
1 2 3 4 5 6 7 8 9 10 11 12 13 package  mainimport  (	"fmt"  	"strings"  ) func  main () 	str1 := "hello,world, world"  	fmt.Println(strings.Count(str1, "l" ))  	fmt.Println(strings.Count(str1, "o" ))  	fmt.Println(strings.Count(str1, "z" ))  } 
重复n次返回 Repeat(s string, count int) string,返回 copy n 次的新字符串
1 2 3 4 5 6 7 8 9 10 11 12 package  mainimport  (	"fmt"  	"strings"  ) func  main () 	str2 := "hello,world"  	fmt.Println(strings.Repeat(str2, 1 ))  	fmt.Println(strings.Repeat(str2, 2 ))  } 
大小写转换 
ToLower(s string) string:转小写ToUpper(s string) string:转大写 
1 2 3 4 5 6 7 8 9 10 11 12 package  mainimport  (	"fmt"  	"strings"  ) func  main () 	str2 := "Hello,World"  	fmt.Println(strings.ToLower(str2))  	fmt.Println(strings.ToUpper(str2))  } 
移除指定内容 
Trim(s, cutset string) string:去掉首尾指定的字符TrimSpace(s string) string:去掉首尾空格TrimPrefix(s, prefix string) string:去掉前缀指定的字符TrimSuffix(s, suffix string) string:去掉后缀指定的字符 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package  mainimport  (	"fmt"  	"strings"  ) func  main () 	fmt.Println(strings.Trim("Hello,WorldH" , "H" ))  	fmt.Println(strings.TrimSpace(" Hello,WorldH " ))  	fmt.Println(strings.TrimPrefix("Hello" , "H" ))  	fmt.Println(strings.TrimSuffix("Hello" , "o" ))  	fmt.Println(strings.TrimLeft("Hello" , "H" ))  	fmt.Println(strings.TrimRight("Hello" , "o" ))  } 
字符串切割 
Fields(s string) []string:返回空格分隔的子串Split(s, sep string) []string:指定分隔符,返回分隔的子串 
1 2 3 4 5 6 7 8 9 10 11 package  mainimport  (	"fmt"  	"strings"  ) func  main () 	fmt.Println(strings.Fields("Hello World" ))  	fmt.Println(strings.Split("Hello Word, Word" , "," ))  } 
字符数组拼接 
Join(elems []string, sep string) string:传入字符串数组和连接符,返回字符串 
1 2 3 4 5 6 7 8 9 10 11 12 package  mainimport  (	"fmt"  	"strings"  ) func  main () 	str3 := []string {"hello" , "world" , "best" } 	rest := strings.Join(str3, "_" ) 	fmt.Println(rest)  }