3 回答

TA貢獻1845條經驗 獲得超8個贊
Go 支持從rune
to的轉換,byte
就像它對所有數字類型對所做的那樣。如果不允許轉換,那將是一個令人驚訝的特殊int32
情況byte
。
但底層的類型
rune
是int32
(因為 Go 使用 UTF-8)
這遺漏了一個重要的細節:rune
是int32
. 它們是同一類型。
確實,底層類型是rune
is int32
,但這是因為rune
andint32
是相同的類型,而內置類型的底層類型是類型本身。
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)
轉換感到遺憾,因為它在實踐中不是很有用,而且轉換也不是某些人所期望的。庫函數是該功能的更好位置。

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
}

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。
- 3 回答
- 0 關注
- 141 瀏覽
添加回答
舉報