我有一个大小字节数组,做完之后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
}
你可以调用sum2()
类型的值仅[2]int
但如果你有类型的数组[3]int
,你 不能
因为这些2种类型是不同的!sum2()
如果仅包含的一个切片,您也无法调用int
(您无法访问切片的支持数组)。同时,您可以sum()
使用所有[]int
切片调用函数,如果有数组,则仍可以通过传递arr[:]
给sum()
函数来使用它。
注意:
另请注意,将“随机”字节片转换为极string
有可能不是您想要的,因为“随机”字节片可能不是有效的UTF-8字节序列。
而是使用encoding/hex
包将结果转换为十六进制字符串,如下所示:
fmt.Println(hex.EncodeToString(b[:]))
问题内容: 我有一个大小字节数组,做完之后。 我得到错误: 无法将b(类型[16] byte)转换为字符串类型 问题答案: 您可以将其称为切片:
我有一个用盐散列加密密码的类。 但是,如果要向类传递null,则会出现以下错误: 当我使用类时,我得到错误:“不能隐式转换类型字符串到Byte[]”
问题内容: 我有一个byte.Buffer,我使用binary.Write()函数包装了数据。然后,我需要将此字节数组发送到C函数。使用Go 1.6时,我未能成功解决这一问题。 它在调用C函数的行上失败: C函数: 我能够使以下内容正常工作,但将字节数组转换为字符串感觉不对。有一个更好的方法吗?这种方法是否会对数据产生副作用? 同样,这需要在Go 1.6(引入了更严格的cgo指针规则)下工作。 谢
问题内容: 我有一个我使用的,因为我想在逻辑上区分不同类型的字节。 我可以轻松地进行转换, 但我找不到转换或转换切片的方法:失败。 这样的事情可能吗?内存中的位是相同的(对吗?),因此应该采取某种方法,除非逐字节复制到新对象中。 例如,这些都不起作用:http : //play.golang.org/p/WPhD3KufR8 问题答案: 您不能将自己的myByte的片转换为字节的片。 但是您可以拥
问题内容: 我是Go的新手,正在尝试执行以下操作: 我搜索了很多,但真的不知道该怎么做。 我知道这行不通: 问题答案: 这不是实现它的最有效方法,但是您可以简单地编写: 被称为:
问题内容: 如何在Golang中将大整数转换为字符串(或整数)? 问题答案: 只需使用以下方法:http : //golang.org/pkg/math/big/#Int.String