golang マップはアドレス指定できません

WBOY
リリース: 2023-05-10 18:33:37
オリジナル
709 人が閲覧しました

Golang では、マップは非常に一般的に使用されるデータ構造です。これは、関連するデータのセットを格納するために使用される、キーと値のペアの順序付けされていないコレクションです。 Golang のマップは非常に便利ですが、通常の変数とは根本的に異なります。つまり、マップはアドレス指定可能ではありません。 Golang のマップがアドレス指定できない理由を調べてみましょう。

まず、Golang におけるマップの定義を見てみましょう。その構文は次のとおりです。

map[KeyType]ValueType
ログイン後にコピー

このうち、KeyType はマップ内のキーの種類を表し、ValueType はマップ内の値の種類を表します。たとえば、次の例では、文字列型のキーと int 型の値を使用してマップを定義します:

var m map[string]int
ログイン後にコピー

make 関数を使用してマップを初期化できます。たとえば:

m := make(map[string]int)
ログイン後にコピー

マップの初期化 値は nil です。初期化されていないマップを代入または操作に直接使用すると、実行時エラーが発生します。

メモリ内のマップの格納構造は、配列やポインターとは異なり、ハッシュ テーブルによって実装されます。各キーと値のペアには、データをすばやく検索するためのインデックスとしてハッシュ値があります。マップがアドレス指定可能な場合、そのハッシュが変更され、データを迅速に検索できなくなり、マップの内部構造が破損します。

さらに、マップのサイズは動的に変化し、キーと値のペアの追加または削除に基づいて動的に拡大または縮小できます。マップがアドレス可能である場合、その内部構造が変更されるため、Golang の設計者はマップのアドレス可能性を無効にします。

マップに加えて、Golang のスライスもアドレス指定できません。これは、スライスの基礎となる構造が配列へのポインタと長さの値を持つ構造であるためです。スライスをアドレス指定できる場合、基礎となる配列のアドレスが変更され、スライスのポインタと長さの値が無効になります。したがって、Golang スライスのアドレッシングの設計者も無効になります。

Golang では、マップまたはスライス内の値を変更する必要がある場合、インデックスまたはポインターを使用して操作できます。たとえば、次のコードは、インデックスを使用してマップ内の値を変更する方法を示しています。

m := make(map[string]int)
m["a"] = 1
m["b"] = 2
m["c"] = 3

m["a"] = 4
fmt.Println(m) // map[a:4 b:2 c:3]
ログイン後にコピー

スライス内の値を変更する必要がある場合は、まずスライス内の特定の場所へのポインターを取得します。ポインタを使用して変更します。たとえば、次のコードは、ポインタを使用してスライス内の値を変更する方法を示しています。

s := []int{1, 2, 3}
p := &s[1]
*p = 4
fmt.Println(s) // [1 4 3]
ログイン後にコピー

つまり、Golang では、マップとスライスは非常に一般的に使用されるデータ構造ですが、アドレス指定できません。それらの値の 1 つを変更する必要がある場合は、インデックスまたはポインターを使用して操作できます。同時に、マップとスライスの基礎となる実装と、それらの動的拡張メカニズムに注意を払う必要があります。

以上がgolang マップはアドレス指定できませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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