Golang の「array」と「slice{array,array,...}」の違いは何ですか?

WBOY
リリース: 2024-02-08 23:10:10
転載
1113 人が閲覧しました

Golang 中 `array` 和 `slice{array,array,...}` 有什么区别?

Golang の「array」と「slice{array,array,...}」の違いは何ですか?これは多くの初心者からよく聞かれる質問です。 PHP エディター Zimo が答えます: Golang では、「配列」は固定長のシーケンスであり、一度定義すると長さを変更することはできません。 「スライス」は、必要に応じて拡張または縮小できる動的な長さのシーケンスです。さらに、「配列」の長さは定義時に決定されますが、「スライス」の長さは実行時に動的に変更できます。したがって、使用する場合は、実際のニーズに基づいて適切なデータ構造を選択する必要があります。

質問内容

理由を知りたいのでヒントをお願いします。

配列を res に追加したいのですが、res は 2D スライスです。したがって、最初に変換する必要があります。 配列をスライスに変換すると、エラーが発生します。

リーリー リーリー

しかし、結果は私が望むものではありません。

次に、for ループを暫定的に変更しました

リーリー リーリー

結果は正しいですが、なぜですか? k[:][]int{k[0],k[1],k[2]} の違いは何ですか?

解決策

ループを

に変更します リーリー

元のループでは、メモリ内の特定の場所を持つ [3]int 型の変数 k を宣言しています。ループの各反復では、マップ mm からの異なるキーがこの変数にコピーされます。ここまでは順調ですね。

k[:] を使用してスライスに変換すると、 配列 k を指すスライス ヘッダーが作成されます。ここで問題が発生しました。ループの次の反復で、k の値が上書きされました。ループ内で作成されたすべてのスライスは、メモリ内の同じ場所にある同じバッキング配列 k を指します。

最初に

k の値をループ内で宣言された変数にコピーすることで、各スライスに独自のバッキング配列を与えることで、この問題を回避できます。

以上がGolang の「array」と「slice{array,array,...}」の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!