我最近尝试在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
我做错了什么,我应该如何添加两个字节数组呢?
答案 0 :(得分:39)
Appending to and copying slices
可变函数
append
将零个或多个值x
追加到s
个 键入S
,它必须是切片类型,并返回结果切片, 也是类型S
。值x
将传递给...T
类型的参数 其中T
是S
的元素类型和相应的参数传递 规则适用。
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...)