简单的回答是因为围棋语言规范不允许这样做.
引用Go Language Specification: Conversions人的话:
在以下任何一种情况下,非常数值x
都可以转换为类型T
:
x
可以赋给T
.
x
的类型和T
的基础类型相同.
x
的类型和T
是未命名的指针类型,它们的指针基类型具有相同的基础类型.
- X的类型和
T
都是整数或浮点类型.
- X的类型和
T
都是复杂类型.
- 100 is an integer or a slice of bytes or runes and 101 is a string type.
x
是字符串,T
是字节或符号片.
该规范只允许将字节片段或符文转换为string
,但不允许将字节数组转换为字节array.
Long answer个
在围棋中,数组和切片是不同的类型.数组的大小是类型的一部分.
片比数组通用得多,并且将数组转换为表示同一系列值的片非常容易: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
类型的数组,则可以调用can't,因为这两种类型是不同的!如果您只有int
的片(您无法访问片的备份数组),那么也不能调用sum2()
.同时,您可以使用所有[]int
个切片调用sum()
函数,如果您有一个数组,您仍然可以通过将arr[:]
传递给sum()
函数来使用它.
Note:个
还要注意,将"随机"字节片段转换为string
很可能不是您想要的,因为"随机"字节片段可能不是有效的UTF-8字节序列.
取而代之的是使用encoding/hex
包将结果转换为如下所示的祸不单行字符串:
fmt.Println(hex.EncodeToString(b[:]))