深入解析Go?變量字符串與字符編碼問題
字符串就是一串固定長度的字符連接起來的字符序列(很多字符拼接在一起的)。
Go的字符串是由單個字節(jié)連接起來的。Go語言的字符串的字節(jié)使用UTF-8編碼標識Unicode文本
字符串
與其他主要編程語?的差異
string 是數(shù)據(jù)類型,不是引?或指針類型(因為是數(shù)據(jù)類型,所以string類型的零值不會是一個空類型nil,而是一個空字符串。)
var a []int
if a == nil{
fmt.Println("a is nil")
}
var b string
if b == ""{
fmt.Println("b is kong")
}string 是只讀的 byte slice,len 函數(shù)可以它所包含的 byte 數(shù)(string底層也是一個byte的數(shù)組)
string 的 byte 數(shù)組可以存放任何數(shù)據(jù)
var s string fmt.Println(len(s)) // s[1] = "3" string是不可變的byte slice s = "hello" fmt.Println(len(s)) s = "\xE4\xB8\xA5" //可以存儲任何二進制數(shù)據(jù) fmt.Println(s,len(s)) 0 5 嚴 3
可以看到len得到的是字符串里面的byte數(shù),不一定代表里面的字符數(shù)。(中文由3個byte組成)
Unicode UTF8
- Unicode 是?種字符集(code point)(是字符的編碼)
- UTF8 是 unicode 的存儲實現(xiàn) (轉(zhuǎn)換為字節(jié)序列的規(guī)則,也就是我提供了一種編碼,并沒有說這種編碼在物理上怎么存儲起來)
rune是能夠取出字符串里面unicode,這樣就可以得到字符串。可以看到utf8存儲分為了三個byte。
s = "中"
fmt.Println(len(s)) //是byte數(shù)
c := []rune(s) //rune能夠取出字符串里面的unicode,這是c語言的機制,能夠幫我們做轉(zhuǎn)換
fmt.Printf("中 unicode 編碼%x\n",c[0])
fmt.Printf("中 UTF8 存儲樣式 %x",s)
3
中 unicode 編碼4e2d
中 UTF8 存儲樣式 e4b8ad
可以看到中字在字符編碼集里面的編碼,物理存儲形式是依賴于utf8規(guī)則,被存儲為0xE4B8AD,最后放在了string對應byte切片里面。分別是3個byte,每個byte放一個。
常?字符串函數(shù)
- strings 包 (https://golang.org/pkg/strings/)
- strconv 包 (https://golang.org/pkg/strconv/)
到此這篇關于Go 變量字符串與字符編碼的文章就介紹到這了,更多相關go 變量字符串字符編碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Golang?Gin解析JSON請求數(shù)據(jù)避免出現(xiàn)EOF錯誤
這篇文章主要為大家介紹了Golang?Gin?優(yōu)雅地解析JSON請求數(shù)據(jù),避免ShouldBindBodyWith出現(xiàn)EOF錯誤的源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04

