簡體   English   中英

為什么不能在Go中將[Size]字節轉換為字符串?

[英]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.

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