1 回答

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
這在Spec: Conversions: Conversions to and from a string type 中有介紹:
將有符號(hào)或無(wú)符號(hào)整數(shù)值轉(zhuǎn)換為字符串類型會(huì)生成一個(gè)包含整數(shù)的 UTF-8 表示的字符串。超出有效 Unicode 代碼點(diǎn)范圍的值將轉(zhuǎn)換為
"\uFFFD"
.
如此有效地將數(shù)值轉(zhuǎn)換為 時(shí)string
,它只能產(chǎn)生string
一個(gè)rune
(字符)。由于 Gostrings
在內(nèi)存中存儲(chǔ)為 UTF-8 編碼的字節(jié)序列,如果您將其轉(zhuǎn)換string
為[]byte
:
將字符串類型的值轉(zhuǎn)換為字節(jié)類型的切片會(huì)產(chǎn)生一個(gè)切片,其連續(xù)元素是字符串的字節(jié)。
當(dāng)您嘗試將0x12345678
,0x10000000
和0x20000000
值轉(zhuǎn)換為 時(shí)string
,由于它們超出了有效 Unicode 代碼點(diǎn)的范圍,因此根據(jù)規(guī)范,它們將轉(zhuǎn)換為"\uFFFD"
UTF-8 編碼中的[]byte{239, 191, 189}
; 當(dāng)編碼為十六進(jìn)制字符串時(shí):
fmt.Println(hex.EncodeToString([]byte("\uFFFD"))) // Output: efbfbd
或者干脆:
fmt.Printf("%x", "\uFFFD") // Output: efbfbd
閱讀博客文章Go 中的字符串、字節(jié)、符文和字符,了解有關(guān)string
內(nèi)部結(jié)構(gòu)的更多詳細(xì)信息。
順便說一句,從 Go 1.5 開始,Go 運(yùn)行時(shí)(大部分)是在 Go 中實(shí)現(xiàn)的,所以這些轉(zhuǎn)換現(xiàn)在是在 Go 中實(shí)現(xiàn)的,可以在runtime
包中找到:runtime/string.go
,查找intstring()
函數(shù)。
- 1 回答
- 0 關(guān)注
- 231 瀏覽
添加回答
舉報(bào)