这似乎是这将是整个interwebs一个相当普遍的事情,丰富的实例,但我似乎无法找到如何将一个转换的例子[32]byte来[]byte.
我有一个函数,我从一个返回数组的外部库调用
func Foo() [32]byte {...}
Run Code Online (Sandbox Code Playgroud)
然后我需要将该结果传递给不同的函数以进行进一步处理.
func Bar(b []byte) { ... }
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果我试着打电话
d := Foo()
Bar(d)
Run Code Online (Sandbox Code Playgroud)
我明白了
cannot convert d (type [32]byte) to type []byte
Run Code Online (Sandbox Code Playgroud)
干
[]byte(d)
Run Code Online (Sandbox Code Playgroud)
并没有好多少.我该怎么做,尤其是在没有创建数据副本的情况下(当我正在做的所有内容传递时,复制这些数据似乎很愚蠢).
Not*_*fer 82
这应该工作:
func Foo() [32]byte {
return [32]byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}
}
func Bar(b []byte) {
fmt.Println(string(b))
}
func main() {
x := Foo()
Bar(x[:])
}
Run Code Online (Sandbox Code Playgroud)
它不会创建底层缓冲区的副本
jam*_*her 36
arr[:] // arr is an array; arr[:] is the slice of all elements
Run Code Online (Sandbox Code Playgroud)
小智 7
这样就可以了:
slice := array[0:len(array)]
Run Code Online (Sandbox Code Playgroud)
还避免复制底层缓冲区.
您通常可以按其边界对数组进行切片::
var a [32]byte
slice := a[:]
Run Code Online (Sandbox Code Playgroud)
更一般地,对于以下数组:
var my_array [LENGTH]TYPE
Run Code Online (Sandbox Code Playgroud)
您可以通过编写来生成不同大小的切片:
my_array[START_SLICE:END_SLICE]
Run Code Online (Sandbox Code Playgroud)
省略START_SLICE是否等于下限,END_SLICE如果等于上限,在您的情况下:
a[0:32]
Run Code Online (Sandbox Code Playgroud)
生成底层数组的切片,等效于:
a[0:]
a[:32]
a[:]
Run Code Online (Sandbox Code Playgroud)