Maison >développement back-end >Golang >Comment modifier les champs Struct dans les valeurs Go Map ?

Comment modifier les champs Struct dans les valeurs Go Map ?

DDD
DDDoriginal
2024-11-28 19:51:11907parcourir

How to Modify Struct Fields Within Go Map Values?

Adressage des valeurs de carte

Dans Go, tenter de modifier un champ de structure directement dans une valeur de carte, comme le montre l'exemple suivant, entraîner une erreur de compilation :

import (
    "fmt"
)

type pair struct {
    a float64
    b float64
}

func main() {
    // Create a map where values are of the "pair" type.
    dictionary := make(map[string]pair)

    // Add an element to the map.
    dictionary["xxoo"] = pair{5.0, 2.0}

    fmt.Println(dictionary["xxoo"]) // Output: {5 2}

    // Attempt to modify a field within the map value.
    dictionary["xxoo"].b = 5.0 // Error: cannot assign to dictionary["xxoo"].b
}

Ce message d'erreur est rencontré car les valeurs de la carte ne sont pas adressables. L'adressabilité est un concept fondamental dans Go et fait référence à la capacité de localiser l'adresse mémoire d'une variable. Les valeurs non adressables ne peuvent pas être modifiées indirectement, car tenter d'accéder à un champ de structure d'une valeur non adressable entraîne une erreur de compilation.

Pour résoudre ce problème, il existe deux approches principales :

Utilisation des valeurs de pointeur

Une approche consiste à utiliser une valeur de pointeur comme valeur de carte. Cette indirection rend la valeur adressable, permettant des modifications de champ. Voici un exemple :

import (
    "fmt"
)

type pair struct {
    a float64
    b float64
}

func main() {
    // Create a map where values are pointers to "pair" structs.
    dictionary := make(map[string]*pair)

    // Add an element to the map.
    dictionary["xxoo"] = &pair{5.0, 2.0}

    fmt.Println(dictionary["xxoo"]) // Output: &{5 2}

    // Modify a field within the pointed-to struct.
    dictionary["xxoo"].b = 5.0

    fmt.Println(dictionary["xxoo"].b) // Output: 5
}

Copie ou remplacement de valeur

Vous pouvez également travailler avec des valeurs non adressables en copiant la valeur ou en la remplaçant entièrement. Voici deux exemples :

// Value Copying
dictionary["xxoo"] = pair{5.0, 5.0}
// Value Replacement
p := dictionary["xxoo"]
p.b = 5.0
dictionary["xxoo"] = p

Ces deux approches vous permettent de modifier la structure « paire » dans la carte.

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!

Déclaration:
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