2011-12-11 3 views
16

私は最近、Goで2バイトの配列スライスを追加しようとしましたが、いくつかの奇妙なエラーに遭遇しました。2つの[]バイトスライスまたは配列を使用して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) 

とエラーは以下のとおりです:私のコードがある

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

何:ゴーのスライスの疑惑堅牢性が問題になることはありません考慮し

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

私は間違っているのですが、2バイトの配列をどのように追加すればいいですか?

答えて

27

Appending to and copying slices

スライスタイプでなければなりませんappendが タイプSsにゼロ以上の値xを追加可変引数関数のようになります。結果のスライス も返します。Sxの値は、タイプ...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) 
} 
4

append()は、タイプ[]Tのスライスをとり、スライス・メンバTのタイプの可変数をとります。つまり、スライスとして[]uint8append()に渡すと、それ以降のすべての引数はuint8になります。

これに対する解決方法は、可変引数の代わりにスライスを渡すためにslice...構文を使用することです。あなたのコードは

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

five:=append(three, four...) 
関連する問題