简短的回答是因为 Go 语言规范不允许这样做。
引用自Go 语言规范:转换 http://golang.org/ref/spec#Conversions:
非常数值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
}
您可以致电sum2()
仅适用于类型的值[2]int
但如果你有一个类型数组[3]int
, you can't因为这两种类型是不同的!你也不能打电话sum2()
如果你只有一片int
的(您无法访问切片的支持数组)。同时您可以致电您的sum()
与所有功能[]int
切片,如果你有一个数组,你仍然可以通过传递来使用它arr[:]
给你的sum()
功能。
Note:
另请注意,将“随机”字节片转换为string
很可能不是您想要的,因为“随机”字节片可能不是有效的 UTF-8 字节序列。
相反,使用encoding/hex http://golang.org/pkg/encoding/hex/包将结果转换为十六进制字符串,如下所示:
fmt.Println(hex.EncodeToString(b[:]))