スライスを固定サイズの配列に変換する
スライスを固定サイズの配列に変換する必要があるシナリオがよくあります。 Go では、スライスは拡大および縮小できる動的なデータ構造ですが、配列は固定サイズであり、特定のサイズで初期化する必要があります。
次のコードを考えてみましょう。
func gen(bricks []Brick) { if len(bricks) == 16 { if check(Sculpture{bricks}) { var b [16]Brick = bricks[0:16]; // Error: Cannot assign slice to array } } }
この中でコードでは、bricks という名前のスライスを固定サイズの配列に変換しようとします。ただし、スライスと配列の型が異なるため、エラーが発生します。
コピーの使用
スライスを固定サイズの配列に変換するには、コピーを使用できます。関数。 copy 関数は、あるスライスまたは配列から別のスライスまたは配列に要素をコピーします。これは、コピー先のスライスまたは配列とソースのスライスまたは配列の 2 つの引数を取ります。
次の例は、コピーを使用してスライスを配列に変換する方法を示しています。
slice := []byte("abcdefgh") var arr [4]byte copy(arr[:], slice[:4]) fmt.Println(arr)
この例では、たとえば、copy 関数はスライスの最初の 4 バイトを arr 配列にコピーします。結果の配列には、値 [97 98 99 100] が含まれます。
スライスから配列への変換の使用 (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] // s4 := (*[4]byte)(s) // panics: len([4]byte) > len(s)
この例ではでは、スライス s を作成し、それを使用して 3 つの配列ポインター (s0、s1、および s2) を初期化します。 s0 は長さ 0 の配列へのポインター、s1 は 1 つの要素の配列へのポインター、s2 は 2 つの要素の配列へのポインターです。
この機能は、次のスライスでのみ使用できることに注意してください。基礎となる配列によってサポートされます。スライスが配列によってサポートされていない場合でも、コピー関数を使用して配列に変換する必要があります。
以上がGo スライスを固定サイズの配列に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。