如何使用Go附加两个[]字节切片或数组?

时间:2011-12-11 02:13:59

标签: arrays append byte go

我最近尝试在Go中追加两个字节的数组切片,并遇到了一些奇怪的错误。我的代码是:

one:=make([]byte, 2)
two:=make([]byte, 2)
one[0]=0x00
one[1]=0x01
two[0]=0x02
two[1]=0x03

log.Printf("%X", append(one[:], two[:]))

three:=[]byte{0, 1}
four:=[]byte{2, 3}

five:=append(three, four)

错误是:

cannot use four (type []uint8) as type uint8 in append
cannot use two[:] (type []uint8) as type uint8 in append

考虑到Go的切片所谓的稳健性应该不是问题:

http://code.google.com/p/go-wiki/wiki/SliceTricks

我做错了什么,我应该如何添加两个字节数组呢?

2 个答案:

答案 0 :(得分:39)

  

Appending to and copying slices

     

可变函数append将零个或多个值x追加到s个   键入S,它必须是切片类型,并返回结果切片,   也是类型S。值x将传递给...T类型的参数   其中TS的元素类型和相应的参数传递   规则适用。

     

append(s S, x ...T) S // T is the element type of S

     

Passing arguments to ... parameters

     

如果最终参数可分配给切片类型[]T,则可能是   如果参数是...T参数的值,则传递不变   然后是...

您需要使用[]T...作为最终参数。

例如,

package main

import "fmt"

func main() {
    one := make([]byte, 2)
    two := make([]byte, 2)
    one[0] = 0x00
    one[1] = 0x01
    two[0] = 0x02
    two[1] = 0x03
    fmt.Println(append(one[:], two[:]...))
    three := []byte{0, 1}
    four := []byte{2, 3}
    five := append(three, four...)
    fmt.Println(five)
}

答案 1 :(得分:5)

append()采用[]T类型的切片,然后采用切片成员类型T的可变数量的值。换句话说,如果您将[]uint8作为切片传递给append(),那么它希望每个后续参数都为uint8

对此的解决方案是使用slice...语法来传递切片来代替varargs参数。您的代码应该是

log.Printf("%X", append(one[:], two[:]...))

five:=append(three, four...)