ホームページ  >  記事  >  バックエンド開発  >  Go で for ループを使用せずに配列を初期化するにはどうすればよいですか?

Go で for ループを使用せずに配列を初期化するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-31 20:12:02403ブラウズ

How can I initialize an array in Go without using a for loop?

For ループを使用せずに Go で配列を初期化する

Go で配列を操作する場合、多くの場合、値を初期化する必要があります。最も簡単な方法は、次の例に示すように、for ループを使用することです。

<code class="go">for i := 0; i < n; i++ {
    A[i] = true
}</code>

ただし、このアプローチは、大きな配列の場合は退屈になる可能性があります。幸いなことに、利用可能な代替手段がいくつかあります。

複合リテラル

複合リテラルを使用すると、より簡潔な方法で配列とスライスを作成および初期化できます。

<code class="go">b1 := []bool{true, true, true}
b2 := [3]bool{true, true, true}</code>

複合リテラルは常に配列を指定された型のゼロ値に初期化することに注意してください。 bool の場合、これはすべての値が false になることを意味します。

定数の使用

すべての要素を特定の値 (例: true) に初期化する場合)、定数を導入して複合リテラルで使用できます。

<code class="go">const T = true
b3 := []bool{T, T, T}</code>

Alternative Logic

特定の状況では、配列内の目的の値の逆数。これにより、デフォルトのゼロ化された配列の動作を利用できるようになります。

<code class="go">presents := []bool{true, true, true, true, true, true}

// Equivalent to:
missings := make([]bool, 6) // All false (not missing)</code>

効率的な "memset" 操作

パフォーマンスが重要な場合は、次の使用を検討できます。 memset 操作の実装:

<code class="go">import (
    "bytes"
    "unsafe"
)

func memset(p []interface{}, v interface{}) {
    b := bytes.NewBuffer(make([]byte, unsafe.Sizeof(v)))
    b.Reset()
    for i := range p {
        b.Write(b.Bytes())
        copy(p[i:i+1], *(*[]byte)(unsafe.Pointer(&v)))
    }
}</code>

このアプローチは、大きな配列の場合に特に効率的です。

以上がGo で for ループを使用せずに配列を初期化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。