簡體   English   中英

在將字節切片轉換為字符串時,Golang會進行任何轉換嗎?

[英]Does Golang do any conversion when casting a byte slice to a string?

在將字節切片轉換為字符串時,Golang會進行任何轉換或以某種方式嘗試解釋字節嗎? 我剛試過一個包含空字節的字節片,看起來它仍然保持字符串不變。

var test []byte
test = append(test, 'a')
test = append(test, 'b')
test = append(test, 0)
test = append(test, 'd')
fmt.Println(test[2] == 0) // OK

但是如何使用無效的unicode點或UTF-8編碼。 鑄造能否失敗或數據被破壞?

Go編程語言規范

字符串類型

字符串類型表示字符串值的集合。 字符串值是(可能為空)字節序列。

轉換

轉換為字符串類型的轉換

將一片字節轉換為字符串類型會產生一個字符串,其連續字節是片的元素。

 string([]byte{'h', 'e', 'l', 'l', '\\xc3', '\\xb8'}) // "hellø" string([]byte{}) // "" string([]byte(nil)) // "" type MyBytes []byte string(MyBytes{'h', 'e', 'l', 'l', '\\xc3', '\\xb8'}) // "hellø" 

將字符串類型的值轉換為字節切片類型會產生一個切片,其連續元素是字符串的字節。

 []byte("hellø") // []byte{'h', 'e', 'l', 'l', '\\xc3', '\\xb8'} []byte("") // []byte{} MyBytes("hellø") // []byte{'h', 'e', 'l', 'l', '\\xc3', '\\xb8'} 

字符串值是(可能為空)字節序列。 字符串值可能表示也可能不表示以UTF-8編碼的Unicode字符。 在從byte切換到string或從stringbyte切片的轉換期間,沒有對字節的解釋。 因此,不會更改字節,轉換也不會失敗。

不,鑄造不能失敗。 這是一個顯示此示例的示例(在Go Playground中運行):

b := []byte{0x80}
s := string(b)
fmt.Println(s)
fmt.Println([]byte(s))
for _, c := range s {
    fmt.Println(c)
}

這打印:

�
[128]
65533

請注意,根據Go規范很好地定義了無效UTF-8的范圍:

對於字符串值,“range”子句迭代從字節索引0開始的字符串中的Unicode代碼點。在連續迭代中,索引值將是連續UTF-8編碼的代碼點的第一個字節的索引。字符串和rune類型的第二個值將是相應代碼點的值。 如果迭代遇到無效的UTF-8序列,則第二個值將是0xFFFD,即Unicode替換字符,下一次迭代將在字符串中前進一個字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM