为什么 Go 中无法将 [Size]byte 转换为字符串?

2024-04-28

我有一个大小字节数组,是我做完之后得到的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

我在这里找到解决方案problem https://stackoverflow.com/questions/26072921/how-do-i-convert-sizebyte-to-string-in-go/28039572?noredirect=1#comment44464957_28039572

改成:

pass = string(b[:])

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

pass = string(b)

简短的回答是因为 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[:]))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Go 中无法将 [Size]byte 转换为字符串? 的相关文章

  • 解决复合赋值中的转换警告

    在我的代码中有很多variable lt lt 1 句子哪里variable类型为 uint16 t 编译器发出警告说 从 int 转换为 uint16 t 可能会改变其值 Wconversion 我该如何解决 我可以使用长格式的符号 例如
  • Java:带有 unicode 字符的 String.toCharArray()

    我知道 char 不能包含 Unicode 字符 例如 char c u1023 那么我该怎么做 String s ABCDEFG u1023 char c s toCharArray 出于性能原因 我想将 s 转换为 CharArray
  • ruby 中的树结构,父子采用数组格式,没有 gem?

    我有一个数组 其中包含这样的项目列表 arr id gt 1 title gt A parent id gt nil id gt 2 title gt B parent id gt nil id gt 3 title gt A1 paren
  • 在 Python 中使用 .split() 和 .join()

    我目前正在 Treehouse 中学习一些 Python 但我遇到了这个挑战 并且不知道我做错了什么 挑战分为三个部分 如下所示 包含提示和我编写的代码 我好像在第三部分犯了错误 Part 1 我想是时候吃点零食了 幸运的是 我有一串各种各
  • 如何在 Swift 中创建不可变数组?

    如何在 Swift 中创建不可变数组 粗略阅读文档会建议你可以这样做 let myArray 1 2 3 但遗憾的是 这实际上产生了一个可变的 固定大小的数组 这种可变性会产生常见的谜题 比如意外的别名和函数参数的突变 let outter
  • 从剪贴板获取文本后将一个字符串插入另一个字符串所需的建议

    简介及相关信息 我有一个edit control只需要接受带符号的十进制数 类似于 12 35 我决定通过以下方式实现这一点subclassing The WM CHAR处理程序似乎运行良好 我需要处理其他几条消息以完全保护用户免于输入无效
  • 使用cgo时的多重定义

    package main int add int a int b return a b import C import fmt func main func Test1 fmt Println C add 1 3 export Test2
  • 基本 C++ 文本对齐

    我正在尝试编写一个程序 该程序从文件中获取输入行并使其恰好为 80 个字符 假设输入行始终小于 80 然后打印该行 这是通过在以下标点符号后添加最多两个空格来完成的 如果一行少于 41 个字符 则不加修改地打印 如果该行仍然不是 80 个字
  • Javascript:打乱数组中的对象组

    我有一个对象数组 我已按键排序 group如下 使得所有具有相同值的对象group在索引中彼此相邻data 例如 var data foo cat group house foo cat group house foo cat group
  • 如何在一列中存储数组或多个值

    运行 Postgres 7 4 是的 我们正在升级 我需要将 1 到 100 个选定项目存储到数据库的一个字段中 98 的情况下 只会输入 1 个项目 而 2 的情况下 如果是这样的话 会输入多个项目 这些项目只不过是文本描述 截至目前 长
  • Android 中的字符串加密

    我正在使用代码进行加密和加密 它没有给出字符串结果 字节数组未转换为字符串 我几乎尝试了所有方法将字节数组转换为字符 但没有给出结果 public class EncryptionTest extends Activity EditText
  • 如何在 Visual Studio Code 中使用 Delve 调试器进行远程调试

    我已经问过了 得到了很好的答复answer https stackoverflow com questions 39058823 how to use delve debugger in visual studio code用于使用 del
  • 有效,但未捕获引用错误:当我在控制台中键入数组时未定义数组

    我用 js 制作了一个 Tic Tac Toe 游戏 我有几个数组 一个用于 html td 元素 网格 用于查看它们之前是否被点击过 boolGrid 还有一个用颜色检查结束条件 colorgrid 我使用 var 关键字及其内容在全局范
  • 我想在后端验证来自 golang 前端的时区

    前端在注册期间发送时区以及其他用户详细信息 我需要在时区上放置一个验证器来进行 api 测试 时区数据的格式为 GMT 10 00 Hawaii GMT 08 00 Pacific Time US amp Canada 我所做的是定义数组中
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • 无循环按键对多维数组求和

    我有这个 Array 0 gt Array f count gt 1 uid gt 105 1 gt Array f count gt 0 uid gt 106 2 gt Array f count gt 2 uid gt 107 3 gt
  • “过滤”JSON 以获得唯一键并获取所有相关值

    找到一个组中所有可能的相关值的最佳方法是什么 var table group a stuff new group a stuff old group b stuff newOld group b stuff old group c stuf
  • 通过API更新Twitter背景

    我在通过 Twitter 的 API 更新背景时遇到了一些问题 target url http www google com logos 11th birthday gif ch curl init curl setopt ch CURLO
  • 将数组数组的字符串转换为 Javascript 数组数组的优雅方法?

    我有一个 ajax 请求 它返回一个值列表 如下所示 5 5 5 6 15 15 7 13 12 我需要它是一个带有数字的 javascript 数组 5 5 5 6 15 15 7 13 12 我尝试将 和 替换为 然后用 分割和 for
  • 为什么 as.character() 返回日期列表中的整数?

    我惊讶地发现 R 中出现以下行为 as character c Sys Date gt 1 2018 02 05 as character list Sys Date gt 1 17567 为什么会出现这种情况 也就是说 显然 17567

随机推荐