Go スライスを固定サイズの配列に変換するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-19 01:06:02
オリジナル
960 人が閲覧しました

How do I convert a Go slice to a fixed-size array?

スライスを固定サイズの配列に変換する

スライスを固定サイズの配列に変換する必要があるシナリオがよくあります。 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート