3 回答

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊
Go 支持從rune
to的轉(zhuǎn)換,byte
就像它對(duì)所有數(shù)字類型對(duì)所做的那樣。如果不允許轉(zhuǎn)換,那將是一個(gè)令人驚訝的特殊int32
情況byte
。
但底層的類型
rune
是int32
(因?yàn)?Go 使用 UTF-8)
這遺漏了一個(gè)重要的細(xì)節(jié):rune
是int32
. 它們是同一類型。
確實(shí),底層類型是rune
is int32
,但這是因?yàn)?code>runeandint32
是相同的類型,而內(nèi)置類型的底層類型是類型本身。
Unicode 代碼點(diǎn)作為int32
值的表示與 UTF-8 編碼無(wú)關(guān)。
因此,轉(zhuǎn)換會(huì)導(dǎo)致信息丟失
是的,數(shù)字類型之間的轉(zhuǎn)換可能會(huì)導(dǎo)致信息丟失。這是 Go 中的轉(zhuǎn)換必須是顯式的原因之一。
請(qǐng)注意,該語(yǔ)句var b byte = '?'
不進(jìn)行任何轉(zhuǎn)換。該表達(dá)式'@'
是一個(gè)無(wú)類型的常量。
如果分配無(wú)類型常量導(dǎo)致信息丟失,編譯器會(huì)報(bào)告錯(cuò)誤。例如,該語(yǔ)句var b byte = '世'
會(huì)導(dǎo)致編譯錯(cuò)誤。
該語(yǔ)言中的所有 UTF-8 編碼功能都與string
類型有關(guān)。UTF-8 感知轉(zhuǎn)換都是與string
類型之間的。可以支持轉(zhuǎn)換,[]byte(numericType)
但這會(huì)將 UTF-8 編碼帶到string
類型之外。
Go 作者對(duì)包含string(numericType)
轉(zhuǎn)換感到遺憾,因?yàn)樗趯?shí)踐中不是很有用,而且轉(zhuǎn)換也不是某些人所期望的。庫(kù)函數(shù)是該功能的更好位置。

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊
是的,可以從 rune 轉(zhuǎn)換為 []byte(例如通過字節(jié))并再次轉(zhuǎn)換回來。
package main
import "fmt"
func main() {
var b byte = '?'
bs := []byte
fmt.Printf("%T %v\n", b, b) // uint8 169
fmt.Printf("%T %v\n", bs, bs) // []uint8 [169]
s := string(bs[0]) // s := string(b) works too.
r2 := rune(s[0]) // r2 := rune(b) works too.
fmt.Printf("%T %v\n", s, s) // string ?
fmt.Printf("%T %v\n", r2, r2) // int32 169
}

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
這種行為的原因與合法的原因相同
var b int32
b = 1000000
fmt.Printf("%b\n", b)
fmt.Printf("%b", uint8(b))
// Output:
// 11110100001001000000
// 1000000
當(dāng)您將具有較大內(nèi)存占用的類型的數(shù)據(jù)放入具有較小內(nèi)存占用的類型時(shí),您應(yīng)該期望轉(zhuǎn)換為松散數(shù)據(jù)。
此外,對(duì)于 a 編碼,rune您可以使用EncodeRune,它確實(shí)使用 a []byte。
- 3 回答
- 0 關(guān)注
- 148 瀏覽
添加回答
舉報(bào)