我有一个大小为md5.Sum()的字节array.

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

我在这problem美元找到了解决方案

更改为:

pass = string(b[:])

但是为什么不能这样使用呢?

pass = string(b)

推荐答案

简单的回答是因为围棋语言规范不允许这样做.

引用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[:]))

Go相关问答推荐

如何用Golang解码这个嵌套的json?

如何在链接中写入链接

Go 1.20 中如何计算连接错误?

nixOS 上的 Nginx 反向代理在try 加载 css/js 时返回 404

用接口来模拟amqp091go的困难

GORM中是否可能自动迁移具有循环关系的表?

是否可以在 hyperledger-chaincode 中使用 gRPC?如果可以,我如何避免在测试网络上调用时出错?

golang gin 获取 cookie json

此 Golang 程序中的同步问题

使用 LINQ 对内部数组进行排序

我突然无法再将我的 GoLang 应用程序部署到 Google AppEngine

如何将 npm 安装进度条通过管道传输到终端?

将 []float64 像素切片转换为图像

将 Golang Gin 与 AWS Lambda 和无服务器与代理路径一起使用

在 Go 中将指针传递给函数的正确方法是什么,以便我可以读取和/或修改指针表示的值?

Golang:每个键具有多个值的映射

不能使用 *T 类型的变量作为参数类型

如何使用 context.WithCancel 启动和停止每个会话的心跳?

Go/Golang:如何从 big.Float 中提取最低有效数字?

如何发送带有登录数据的 GET 请求并将 cookie 数据保存到 txt 文件?