「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go の基本: nil スライスは新しい値を受け入れるのに、nil マップは受け入れない理由

Go の基本: nil スライスは新しい値を受け入れるのに、nil マップは受け入れない理由

2024 年 11 月 1 日に公開
ブラウズ:259

新しい値を Nil スライスに追加できますが、新しい値を Nil マップに追加すると実行時エラーがスローされます。その理由を見てみましょう

var slice []int // nil slice
slice = append(slice, 1) // append works as expected
fmt.Println(slice) // [1]

var m map[string]int // nil map
m["one"] = 1 // ? Runtime panic: assignment to entry in nil map

Nil スライスへの追加が機能する理由:
スライスは、基礎となる配列および動的にサイズ変更されるデータ構造への参照です。 3 つのコンポーネントで構成されています

  • 基になる配列へのポインタ
  • スライスの長さ
  • スライスの容量

nil スライスを宣言すると、長さと容量はゼロになり、基になる配列を指しません。基本的に、追加操作は容量をチェックし、十分でない場合は、新しい要素を格納するのに十分な容量を持つ新しい基になる配列を割り当て、新しく作成された配列を指す新しいスライスを返します。したがって、追加は期待どおりに機能します。

Nil マップへの追加が機能しない理由:
golang のマップは基本的にハッシュ テーブルとして機能し、キーと値のペアを保存するには、まず内部データ構造を初期化する必要があります。

マップを nil (var m map[string]int) として宣言すると、マップは初期化されておらず、キーと値のペアを格納する準備がまだ整っていません。したがって、nil マップに値を追加しようとすると、実行時エラーが発生します。このようなエラーを回避するには、make
を使用してマップを作成します。

var m map[string]int // nil map

m = make(map[string]int) // initialize it
m["one"] = 1 // map is now initialized, so we can add values
print(m) // map[one:1]

  • Go は Pass By Ref をサポートしていますか?
  • 新しいものと Go で作るもの
  • Go は継承をサポートしていますか?
  • Go で簡単な Web サーバーを作成する方法?

コード例とともにそのようなトピックについて詳しく知りたい場合は、私の Github リポジトリを自由にチェックしてください:

Go Basics: Why nil Slices accept new values, but nil Maps don Sai7xp / golangを学ぶ

GoLang の基本から上級まで。デザインパターン、SOLID原則などを含む

リリースステートメント この記事は次の場所に転載されています: https://dev.to/sai7xp/go-basics-why-nil-slices-accept-new-values-but-nil-maps-dont-23l0?1 侵害がある場合は、 Study_golang@163 .comdelete に連絡してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3