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

Susan Sarandon
リリース: 2024-11-11 18:35:03
オリジナル
861 人が閲覧しました

How to Convert a Slice to a Fixed Size Array in Go?

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 サイトの他の関連記事を参照してください。

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