Go でのスライスの固定サイズ配列への変換
Go の一般的なシナリオは、スライスを固定サイズの配列に変換する必要があることです。これは簡単そうに見えますが、コンパイル エラーが発生する可能性があります。このエラーとその解決策を理解するために、次のコード スニペットを分析してみましょう:
func gen(bricks []Brick) { if len(bricks) == 16 { if check(Sculpture{bricks}) { var b [16]Brick = bricks[0:16]; // This line generates the error } } }
エラー メッセージは、スライス オブジェクトを固定サイズの配列に直接割り当てることができないことを示しています。これは、Go がスライスと配列を別個の型として扱うためです。
解決策: 'copy' 関数を使用する
スライスを固定サイズの配列に変換するには、次のようにします。組み込みの「コピー」機能を使用します。この関数は 2 つのスライスを入力として受け取り、指定された数の要素をソース スライスから宛先スライスにコピーします。正しい入力を指定すると、スライスの要素を固定サイズの配列に効果的に転送できます。
「copy」の使用例を次に示します。
slice := []byte("abcdefgh") var arr [4]byte copy(arr[:], slice[:4]) fmt.Println(arr) // Output: [97 98 99 100]
この場合'copy' は、スライスの最初の 4 つの要素を配列 'arr' に転送します。
代替構文
'copy を使用して同じ結果を達成する別の簡潔な方法' はスライス インデックスを省略することです:
copy(arr[:], slice)
「copy」関数は、両方のスライスが収容できる最小数の要素を自動的にコピーします。したがって、サイズが一致する場合、または固定サイズの配列全体を埋めたい場合は、インデックスの指定をスキップできます。
Go 1.17 以降
次のことに注意してください。 Go 1.17 では、スライスから配列への変換のサポートが導入されました。この機能を使用すると、同じ基本型の配列ポインタにスライスを直接割り当てることができます:
s := make([]byte, 2, 4) s0 := (*[0]byte)(s) // s0 != nil s1 := (*[1]byte)(s[1:]) // &s1[0] == &s[1] s2 := (*[2]byte)(s) // &s2[0] == &s[0]
ただし、この機能はまだ実験的であると考えられており、すべての環境で利用できるわけではありません。
以上がGo でスライスを固定サイズの配列に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。