ホームページ  >  記事  >  バックエンド開発  >  golang マップの値が変更される

golang マップの値が変更される

PHPz
PHPzオリジナル
2023-05-10 17:43:37854ブラウズ

golang のマップは非常に一般的に使用されるデータ構造であり、キーを通じて対応する値を取得できます。 golang では、マップの実装はハッシュ テーブルに似ており、高速な検索と挿入操作をサポートします。しかし、mapを使用する場合、その値を変更する必要がある場合があるため、この記事ではgolangでmapの値を変更する方法を詳しく紹介します。

  1. golang のマップ

golang のマップ タイプは、map[keyType]valueType として定義されます。ここで、keyType はキー値のタイプ、valueType は対応するキーです。値のタイプ。例:

var m map[string]int //定义一个string类型的键和一个int类型value的map

golang では、マップの初期化は make またはリテラルを通じて実現できます。

//make初始化
m1 := make(map[string]string)

//字面量初始化
m2 := map[string]string{
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
}
  1. mapの値を変更する

golangではmap自体が参照型なので、mapを操作すると対応する元のmapも変更されます。 。マップ内の値を変更する必要がある場合は、添字演算子を使用して変更できます。

m := map[string]int{
    "apple":  2,
    "banana": 3,
    "orange": 4,
}
m["apple"] = 10 //将apple的value改为10
fmt.Println(m)  //输出: map[apple:10 banana:3 orange:4]

上の例では、m["apple"] = 10 によって apple の値を 10 に変更します。

対応するキーが存在しない場合は、新しいキーと値のペアが自動的に追加されます。

m := map[string]int{
    "apple":  2,
    "banana": 3,
    "orange": 4,
}
m["pear"] = 5 //添加一个新的key-value对
fmt.Println(m) //输出: map[apple:2 banana:3 orange:4 pear:5]
  1. キーが存在するかどうかを確認する

マップの値を変更する前に、まず対応するキーがマップ内に存在するかどうかを確認する必要があります。

v, ok := m[k] を使用して、キー k を持つキーと値のペアがマップ内に存在するかどうかを確認できます。

m := map[string]int{
    "apple":  2,
    "banana": 3,
    "orange": 4,
}
if v, ok := m["apple"]; ok {
    m["apple"] = v + 1 //将apple的value加1
}
fmt.Println(m) //输出: map[apple:3 banana:3 orange:4]

キーが存在する場合、ok の値は true で、v の値は対応する値です。

対応するキーが存在しない場合、ok の値は false となり、v の値は value 型のゼロ値となります。

キーが存在すると判断した場合は、マップの値を直接変更できます。

  1. マップを走査して値を変更する

マップを走査して値を変更する必要がある場合があります。

一般的な方法は、for range を使用してマップをループし、値を変更することです。

m := map[string]int{
    "apple":  2,
    "banana": 3,
    "orange": 4,
}
for k, v := range m {
    m[k] = v * 2 //将key对应的value值乘2
}
fmt.Println(m) //输出: map[apple:4 banana:6 orange:8]

上の例では、for range ループを通じてマップを走査し、キーに対応する値を 2 で乗算します。この方法は、すべてのキーを変更する必要がある状況に適しています。

指定したキーの値のみを変更する必要がある場合は、上記の方法を使用してマップの値を直接変更できます。

  1. スレッド セーフ

最後に、golang のマップはスレッド セーフではないことに注意してください。同時実行の場合、複数のコルーチンが同じマップを同時に変更するため、データ競合の問題が発生する可能性があります。

この問題を解決するには、同期パッケージで提供されている sync.Map タイプを使用できます。これはスレッドセーフなマップ実装です。

var m sync.Map
m.Store("apple", 2)
m.Store("banana", 3)
m.Store("orange", 4)

//使用Load方法获取map中的value值
if v, ok := m.Load("apple"); ok {
    m.Store("apple", v.(int)+1) //将apple的value加1
}

sync.Map タイプを使用すると、同時実行状況でのデータ競合の問題を回避できます。

概要

この記事では、golang でマップの値を変更する方法について詳しく説明します。添字演算子を使用してマップの値を変更する方法を学び、対応するキー値がマップ内に存在するかどうかを判断する方法と、マップを走査して値を変更する方法も学びました。さらに、スレッドセーフなマップ実装である sync.Map 型も導入しました。マップを使用する場合は、データ競合の問題を避けるためにスレッドの安全性の問題に注意する必要があります。

以上がgolang マップの値が変更されるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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