Maison > développement back-end > Golang > le corps du texte

La carte Golang change de valeur

PHPz
Libérer: 2023-05-10 17:43:37
original
861 Les gens l'ont consulté

La carte en golang est une structure de données très couramment utilisée, qui peut obtenir la valeur correspondante via la clé. En Golang, l'implémentation de map est similaire à une table de hachage, prenant en charge des opérations de recherche et d'insertion rapides. Mais lors de l'utilisation de map, nous devons parfois modifier sa valeur. Cet article présentera en détail comment modifier la valeur de map dans golang.

  1. map in golang

Le type de carte dans golang est défini comme : map[keyType]valueType, où keyType est le type de valeur clé, valueType est le type de valeur correspondant à la clé. Par exemple :

var m map[string]int //定义一个string类型的键和一个int类型value的map
Copier après la connexion

En golang, l'initialisation de la carte peut être réalisée via make ou des littéraux.

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

//字面量初始化
m2 := map[string]string{
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
}
Copier après la connexion
  1. Changer la valeur de la carte

Dans Golang, la carte elle-même est un type de référence, donc lors de l'utilisation sur la carte, l'original correspondant la carte sera également modifiée. Si nous devons modifier la valeur dans la carte, nous pouvons le faire via l'opérateur d'indice.

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]
Copier après la connexion

Dans l'exemple ci-dessus, nous modifions la valeur de apple à 10 via m["apple"] = 10.

Si la clé correspondante n'existe pas, une nouvelle paire clé-valeur sera automatiquement ajoutée.

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]
Copier après la connexion
  1. Juger si la clé existe

Avant de modifier la valeur de la carte, nous devons d'abord déterminer si la clé correspondante existe dans le carte.

Vous pouvez utiliser v, ok := m[k] pour vérifier s'il existe une paire clé-valeur avec la clé k dans la carte. v, ok := m[k]的方式检查map中是否存在key为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]
Copier après la connexion

如果key存在,ok的值为true,v的值为对应的value。

如果不存在对应的key,则ok的值为false,v的值为value类型的零值。

在判断key存在的情况下,我们可以直接对map的value进行修改操作。

  1. 遍历map并修改value

有时候,我们需要遍历map并修改其中的value值。

一种常见的方法是使用for range循环访问map,然后对value进行修改。

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]
Copier après la connexion

在上面的例子中,我们通过for range循环遍历map,并将key对应的value值乘2。这个方式适用于需要对所有的key都进行修改的情况。

如果只需要修改指定的key的value值,可以使用上面介绍的直接修改map的value的方式。

  1. 线程安全

最后需要注意的是,golang中的map不是线程安全的。在并发的情况下,多个协程同时修改同一个map,可能会导致数据竞争的问题。

为了解决这个问题,可以使用sync包中提供的sync.Map类型。它是一种线程安全的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
}
Copier après la connexion

通过使用sync.Map类型,可以避免在并发情况下出现数据竞争的问题。

总结

本文详细介绍了在golang中如何改变map的value。我们学习了通过下标操作符对map的value进行修改的方法,还了解了如何判断map中是否存在对应的key值和遍历map并修改value的方法。此外,我们还介绍了sync.Maprrreee

Si la clé existe, la valeur de ok est vraie et la valeur de v est la valeur correspondante. #🎜🎜##🎜🎜#S'il n'y a pas de clé correspondante, la valeur de ok est fausse et la valeur de v est la valeur nulle du type valeur. #🎜🎜##🎜🎜#Quand il est déterminé que la clé existe, on peut directement modifier la valeur de la map. #🎜🎜#
    #🎜🎜#Parcourir la carte et modifier la valeur#🎜🎜##🎜🎜##🎜🎜#Parfois, nous devons parcourir la carte et modifier la valeur. #🎜🎜##🎜🎜#Une méthode courante consiste à utiliser for range pour parcourir la carte, puis à modifier la valeur. #🎜🎜#rrreee#🎜🎜#Dans l'exemple ci-dessus, nous parcourons la carte à travers la boucle for range et multiplions la valeur correspondant à la clé par 2. Cette méthode convient aux situations où toutes les clés doivent être modifiées. #🎜🎜##🎜🎜#Si vous avez uniquement besoin de modifier la valeur de la clé spécifiée, vous pouvez utiliser la méthode décrite ci-dessus pour modifier directement la valeur de la carte. #🎜🎜#
      #🎜🎜#Thread safety#🎜🎜##🎜🎜##🎜🎜#Enfin, il convient de noter que la carte dans golang n'est pas thread-safe. En cas de concurrence, plusieurs coroutines modifient la même carte en même temps, ce qui peut entraîner des problèmes de concurrence de données. #🎜🎜##🎜🎜#Pour résoudre ce problème, vous pouvez utiliser le type sync.Map fourni dans le package de synchronisation. Il s'agit d'une implémentation de carte thread-safe. #🎜🎜#rrreee#🎜🎜#En utilisant le type sync.Map, vous pouvez éviter les problèmes de course aux données dans des situations simultanées. #🎜🎜##🎜🎜#Résumé#🎜🎜##🎜🎜#Cet article détaille comment modifier la valeur de la carte dans Golang. Nous avons appris comment modifier la valeur de la carte via l'opérateur d'indice, et avons également appris comment déterminer si la valeur clé correspondante existe dans la carte et comment parcourir la carte et modifier la valeur. De plus, nous avons également introduit le type sync.Map, qui est une implémentation de carte thread-safe. Lorsque vous utilisez Map, vous devez faire attention aux problèmes de sécurité des threads pour éviter les problèmes de concurrence entre les données. #🎜🎜#

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal