私は最近、Goで2バイト配列スライスを追加しようとしましたが、いくつかの奇妙なエラーに遭遇しました。私のコードは:
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バイト配列を追加するにはどうすればよいですか?
可変個の関数
append
は、0個以上の値x
をs
型のS
に追加します。これはスライス型でなければならず、結果のスライスも返します。タイプS
の。値x
は、タイプ_...T
_のパラメーターに渡されます。ここで、T
はS
の要素タイプであり、それぞれのパラメーター受け渡し規則が適用されます。
append(s S, x ...T) S // T is the element type of S
最後の引数がスライスタイプ_
[]T
_に割り当て可能な場合、引数の後に_...T
_が続くと、_...
_パラメーターの値としてそのまま渡されます。
最後の引数には_[]T...
_を使用する必要があります。
たとえば、最後の引数スライスタイプが_[]byte
_の場合、引数の後に_...
_が続きます。
_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)
}
_
遊び場: https://play.golang.org/p/2jjXDc8_SWT
出力:
_[0 1 2 3]
[0 1 2 3]
_
append()
は、タイプ_[]T
_のスライスを取り、次にスライスメンバーT
のタイプの値の可変数を取ります。言い換えれば、_[]uint8
_をスライスとしてappend()
に渡すと、後続のすべての引数が_uint8
_になります。
これに対する解決策は、varargs引数の代わりにスライスを渡すために_slice...
_構文を使用することです。コードは次のようになります
_log.Printf("%X", append(one[:], two[:]...))
_
そして
_five:=append(three, four...)
_