做網(wǎng)站與考研學(xué)技術(shù)包分配的培訓(xùn)機(jī)構(gòu)
ASCII 碼只需要 7 bit 就能完整地表示,但只能表示英文字母在內(nèi)的 128 個(gè)字符,為了表示世界上大部分的文字系統(tǒng),發(fā)明了 Unicode ,它是 ASCII 的超集,包含世界上書寫系統(tǒng)中存在的所有字符,并且為每個(gè)代碼分配一個(gè)標(biāo)準(zhǔn)編號(hào)(稱為 Unicode CodePoint),在 go 語言中稱為 rune,是 int32 的別名。
go 語言中 ,字符串的底層表示是 byte(8 bit) 序列,而不是 rune( 32 bit )序列。
func main() {str := "nihao"length := len(str)fmt.Println(length)for i, _ := range str {fmt.Println(reflect.TypeOf(str[i]))}
}
運(yùn)行結(jié)果為:
但是,如果使用 for range 遍歷字符串取值的時(shí)候,得到的 value 類型為 rune 類型(3字符),也就是 int32 類型,對應(yīng) Unicode 字符型。
func main() {str := "nihao"length := len(str)fmt.Println(length)for _, v := range str {fmt.Println(reflect.TypeOf(v))}
}
?運(yùn)行結(jié)果:
修改字符串
所以在go語言中修改字符串的時(shí)候,針對不同的情況來進(jìn)行編寫:
當(dāng)字符串中有中文字符:
此時(shí)需要將字符串轉(zhuǎn)換為 []rune 切片進(jìn)行操作
func main() {str := "你好"fmt.Printf("修改前:%s", str)fmt.Println()strr := []rune(str)strr[0] = '我'fmt.Printf("修改后:%s", string(strr))
}
結(jié)果:
?如果使用 []byte 的話編譯會(huì)不通過
當(dāng)字符串中只有英文時(shí):
此時(shí)使用 []rune 或者 []byte 都可以,但是一般會(huì)使用 []byte:
func main() {str := "nihao"fmt.Printf("修改前:%s", str)fmt.Println()strr := []rune(str)strr[0] = 'w'fmt.Printf("[]rune修改后:%s", string(strr))fmt.Println()strrr := []byte(str)strrr[0] = 'w'fmt.Printf("[]byte修改后:%s", string(strr))fmt.Println()
}
運(yùn)行結(jié)果: