亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

符文和字節(切片)之間的轉換

符文和字節(切片)之間的轉換

Go
蝴蝶不菲 2022-06-21 15:53:23
Go 允許從runeto轉換byte。rune但是對于is的底層類型int32(因為 Go 使用 UTF-8),對于byteis uint8,轉換因此會導致信息丟失。但是,無法從符文轉換為[]byte.var b byte = '?'bs := []byte(string('?'))fmt.Println(b)fmt.Println(bs)// Output169[194 169]為什么 Go 允許轉換 from runetobyte而不是runeto []byte?
查看完整描述

3 回答

?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

Go 支持從runeto的轉換,byte就像它對所有數字類型對所做的那樣。如果不允許轉換,那將是一個令人驚訝的特殊int32情況byte。

但底層的類型runeint32(因為 Go 使用 UTF-8)

這遺漏了一個重要的細節:runeint32. 它們是同一類型。

確實,底層類型是runeis int32,但這是因為runeandint32是相同的類型,而內置類型的底層類型是類型本身。

Unicode 代碼點作為int32值的表示與 UTF-8 編碼無關。

因此,轉換會導致信息丟失

是的,數字類型之間的轉換可能會導致信息丟失。這是 Go 中的轉換必須是顯式的原因之一。

請注意,該語句var b byte = '?'不進行任何轉換。該表達式'@'是一個無類型的常量。

如果分配無類型常量導致信息丟失,編譯器會報告錯誤。例如,該語句var b byte = '世'會導致編譯錯誤。

該語言中的所有 UTF-8 編碼功能都與string類型有關。UTF-8 感知轉換都是與string類型之間的。可以支持轉換,[]byte(numericType)但這會將 UTF-8 編碼帶到string類型之外。

Go 作者對包含string(numericType)轉換感到遺憾,因為它在實踐中不是很有用,而且轉換也不是某些人所期望的。庫函數是該功能的更好位置。


查看完整回答
反對 回復 2022-06-21
?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

是的,可以從 rune 轉換為 []byte(例如通過字節)并再次轉換回來。


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

}


查看完整回答
反對 回復 2022-06-21
?
搖曳的薔薇

TA貢獻1793條經驗 獲得超6個贊

這種行為的原因與合法的原因相同


var b int32

b = 1000000

fmt.Printf("%b\n", b)

fmt.Printf("%b", uint8(b))


// Output:

// 11110100001001000000

// 1000000

當您將具有較大內存占用的類型的數據放入具有較小內存占用的類型時,您應該期望轉換為松散數據。


此外,對于 a 編碼,rune您可以使用EncodeRune,它確實使用 a []byte。


查看完整回答
反對 回復 2022-06-21
  • 3 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號