做網(wǎng)站與考研學(xué)技術(shù)包分配的培訓(xùn)機構(gòu)
ASCII 碼只需要 7 bit 就能完整地表示,但只能表示英文字母在內(nèi)的 128 個字符,為了表示世界上大部分的文字系統(tǒng),發(fā)明了 Unicode ,它是 ASCII 的超集,包含世界上書寫系統(tǒng)中存在的所有字符,并且為每個代碼分配一個標(biā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]))}
}
運行結(jié)果為:
但是,如果使用 for range 遍歷字符串取值的時候,得到的 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))}
}
?運行結(jié)果:
修改字符串
所以在go語言中修改字符串的時候,針對不同的情況來進行編寫:
當(dāng)字符串中有中文字符:
此時需要將字符串轉(zhuǎn)換為 []rune 切片進行操作
func main() {str := "你好"fmt.Printf("修改前:%s", str)fmt.Println()strr := []rune(str)strr[0] = '我'fmt.Printf("修改后:%s", string(strr))
}
結(jié)果:
?如果使用 []byte 的話編譯會不通過
當(dāng)字符串中只有英文時:
此時使用 []rune 或者 []byte 都可以,但是一般會使用 []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()
}
運行結(jié)果: