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