繁体   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