How can I use Go append with two []byte slices or arrays?

后端 未结 2 802
醉话见心
醉话见心 2020-12-13 17:57

I recently tried appending two byte array slices in Go and came across some odd errors. My code is:

one:=make([]byte, 2)
two:=make([]byte, 2)
one[0]=0x00
one         


        
相关标签:
2条回答
  • 2020-12-13 18:36

    The Go Programming Language Specification

    Appending to and copying slices

    The variadic function append appends zero or more values x to s of type S, which must be a slice type, and returns the resulting slice, also of type S. The values x are passed to a parameter of type ...T where T is the element type of S and the respective parameter passing rules apply.

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

    Passing arguments to ... parameters

    If the final argument is assignable to a slice type []T, it may be passed unchanged as the value for a ...T parameter if the argument is followed by ....


    You need to use []T... for the final argument.

    For your example, with the final argument slice type []byte, the argument is followed by ...,

    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)
    }
    

    Playground: https://play.golang.org/p/2jjXDc8_SWT

    Output:

    [0 1 2 3]
    [0 1 2 3]
    
    0 讨论(0)
  • 2020-12-13 18:38

    append() takes a slice of type []T, and then a variable number of values of the type of the slice member T. In other words, if you pass a []uint8 as the slice to append() then it wants every subsequent argument to be a uint8.

    The solution to this is to use the slice... syntax for passing a slice in place of a varargs argument. Your code should look like

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

    and

    five:=append(three, four...)
    
    0 讨论(0)
提交回复
热议问题