我有一个大小字节数组,做完之后md5.Sum()。
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是字节或符文的一部分。
在以下任何一种情况下,x可以将非恒定值转换为类型T:
x
T
该规范仅允许将字节的片段或符文转换为string,而不能将字节数组转换为。
string
长答案
在Go中,数组和切片是不同的类型。数组的大小是该类型的一部分。
切片比数组要通用得多,将数组转换为代表相同值序列的切片非常容易:(arr[:]而且价格便宜,结果切片将与该数组共享数组作为后备数组,而不会进行重新分配或复制完成)。
arr[:]
因此,所有功能和支持都提供给切片而不是数组。
只是您要创建一个简单函数的图像,该函数接受数字的切片(任意长度)int并返回数字的总和。像这样:
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 }
你可以调用sum2()类型的值仅[2]int但如果你有类型的数组[3]int,你 不能 因为这些2种类型是不同的!sum2()如果仅包含的一个切片,您也无法调用int(您无法访问切片的支持数组)。同时,您可以sum()使用所有[]int切片调用函数,如果有数组,则仍可以通过传递arr[:]给sum()函数来使用它。
sum2()
[2]int
[3]int
sum()
[]int
注意:
另请注意,将“随机”字节片转换为极string有可能不是您想要的,因为“随机”字节片可能不是有效的UTF-8字节序列。
而是使用encoding/hex包将结果转换为十六进制字符串,如下所示:
encoding/hex
fmt.Println(hex.EncodeToString(b[:]))