web-dev-qa-db-ja.com

2つの[]バイトのスライスまたは配列でGo appendを使用するにはどうすればよいですか?

私は最近、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バイト配列を追加するにはどうすればよいですか?

27
ThePiachu

Goプログラミング言語仕様

スライスへの追加とコピー

可変個の関数appendは、0個以上の値xs型のSに追加します。これはスライス型でなければならず、結果のスライスも返します。タイプSの。値xは、タイプ_...T_のパラメーターに渡されます。ここで、TSの要素タイプであり、それぞれのパラメーター受け渡し規則が適用されます。

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]
_
43
peterSO

append()は、タイプ_[]T_のスライスを取り、次にスライスメンバーTのタイプの値の可変数を取ります。言い換えれば、_[]uint8_をスライスとしてappend()に渡すと、後続のすべての引数が_uint8_になります。

これに対する解決策は、varargs引数の代わりにスライスを渡すために_slice..._構文を使用することです。コードは次のようになります

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

そして

_five:=append(three, four...)
_
5
Lily Ballard