Golang 字符串操作汇总
- 1 string初始化
- 2 遍历string
- 3 byte & Rune
-
1 string初始化
func newString() {
str := "one hello \n world"
fmt.Println(str)
str1 := `two hello \n world`
str2 := `h1
h2
h3`
fmt.Println(str1)
fmt.Println(str2)
var str3 string
str3 = "three hello world"
fmt.Println(str3)
fmt.Println("------------------")
}
2 遍历string
func forString() {
for index, s := range "abcdef" {
fmt.Printf("%c 索引值是 %d\n", s, index)
}
str := "Hello"
for c := 0; c < len(str); c++ {
fmt.Printf("\n字符 = %c 字节 = %v", str[c], str[c])
}
fmt.Println()
fmt.Println("------------------")
}
3 byte & Rune
3.1 初始化
func byteAndRune() {
myslice1 := []byte{72, 101, 108, 108, 111}
mystring1 := string(myslice1)
fmt.Println("String 1: ", mystring1)
fmt.Println("------------------")
myslice2 := []rune{0x47, 0x65, 0x65, 0x6b, 0x73}
mystring2 := string(myslice2)
fmt.Println("String 2: ", mystring2)
fmt.Println("------------------")
}
3.2 byte和rune区别
- rune是用来区分字符值和整数值的
- rune 等同于int32,即4个字节长度,常用来处理unicode或utf-8字符。
- byte 等同于int8,即一个字节长度,常用来处理ascii字符
- 中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8。
- ASCII编码是1个字节,而UTF-8是可变长的编码
- 当要表示中文等非ASCll编码的字符时,需要使用UTF-8编码来保证不会乱码。
- UTF8编码下一个中文汉字由3~4个字节组成,而字符串是由byte字节组成,所以长度也是byte字符长度,这样遍历时遇到中文就乱码了
- 所谓对字符串的修改其实不是对字符串本身的修改,而是复制字符串,同时修改值,即重新分配来内存。
- 在go中修改字符串,需要先将字符串转化成数组,[]byte 或 []rune,然后再转换成 string型。
func byteAndRune() {
str := "你好 world"
fmt.Printf("len(str):%d\n", len(str))
fmt.Printf("len(byte(str)):%d\n", len([]byte(str)))
fmt.Printf("len(rune(str)):%d\n", len([]rune(str)))
for i := 0; i < len(str); i++ {
fmt.Printf("%c", str[i])
}
fmt.Println()
for _, value := range str {
fmt.Printf("%c", value)
}
fmt.Println()
str1 := "abc"
s1 := []byte(str1)
s1[0] = 'b'
fmt.Println(string(s1))
str2 := "你好,世界"
s2 := []rune(str2)
s2[0] = '不'
fmt.Println(string(s2))
}