[英]Why can not convert [Size]byte to string in Go?
我有一個大小的字節數組,我做了md5.Sum()
后得到的。
data := []byte("testing")
var pass string
var b [16]byte
b = md5.Sum(data)
pass = string(b)
錯誤:
cannot convert b (type [16]byte) to type string
我找到了解決這個問題的方法
改成:
pass = string(b[:])
但為什么不能這樣使用呢?
pass = string(b)
簡短的回答是因為Go語言規范不允許它。
引用Go語言規范:轉換 :
在任何這些情況下,非常數值
x
都可以轉換為類型T
:
x
可分配給T
x
的類型和T
具有相同的底層類型。x
的類型和T
是未命名的指針類型,它們的指針基類型具有相同的基礎類型。- x的類型和
T
都是整數或浮點類型。- x的類型和
T
都是復雜類型。x
是整數或字節或符文切片,T
是字符串類型。x
是一個字符串,T
是一個字節或符文的片段。
規范僅允許將一片字節或符文轉換為string
,而不是字節數組。
答案很長
在Go數組和切片是不同的類型。 數組的大小是類型的一部分。
切片比數組更通用,並且將數組轉換為表示相同系列值的切片非常容易: arr[:]
(並且也很便宜,結果切片將共享數組作為其后備數組,無需重新分配或復制將完成)。
因此,所有功能和支持都是為切片而不是為數組提供的。
只是想要創建一個簡單函數的圖像,它接受一個切片(任意長度)的int
數字並返回數字的總和。 像這樣的東西:
func sum(s []int) (sum int) {
for _, v := range s {
sum += v
}
return
}
如果您決定使用數組作為輸入,因為長度是類型的一部分,您將限制函數的可用性,它只能采用相同長度的數組:
func sum2(s [2]int) (sum int) {
for _, v := range s {
sum += v
}
return
}
你只能使用類型為[2]int
值調用sum2()
,但是如果你有一個類型為[3]int
的數組, 則不能,因為這兩種類型是不同的! 如果你只有一個int
片段(你不能訪問片段的后備數組),你也不能調用sum2()
)。 同時你可以用all []int
切片調用你的sum()
函數,如果你有一個數組,你仍然可以通過將arr[:]
傳遞給你的sum()
函數來使用它。
注意:
另請注意,將“隨機”字節切換為string
很可能不是您想要的,因為“隨機”字節切片可能不是有效的UTF-8字節序列。
而是使用encoding/hex
包將結果轉換為十六進制字符串,如下所示:
fmt.Println(hex.EncodeToString(b[:]))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.