Maison >développement back-end >Golang >Comment initialiser correctement les cartes dans Go Structs ?

Comment initialiser correctement les cartes dans Go Structs ?

DDD
DDDoriginal
2024-12-09 22:12:28903parcourir

How to Properly Initialize Maps within Go Structs?

Initialiser des cartes dans Go Structs

L'initialisation d'une carte dans une structure peut être une tâche déroutante. Cet article explore différentes approches pour résoudre ce problème.

Problème : erreur d'exécution

Lors de la tentative d'initialisation d'une carte dans une structure, l'exécution du code suivant peut provoquer une erreur d'exécution. error:

package main

type Vertex struct {
   label string
} 

type Graph struct {
  connections map[Vertex][]Vertex
} 

func main() {
  v1 := Vertex{"v1"}
  v2 := Vertex{"v2"}

  g := new(Graph)
  g.connections[v1] = append(g.coonections[v1], v2)
  g.connections[v2] = append(g.connections[v2], v1)
}

Cette erreur se produit car la carte des connexions est nulle lors de la tentative d'accès à son valeurs.

Solution : Constructeur

Une solution recommandée consiste à créer une fonction constructeur, comme démontré ci-dessous :

func NewGraph() *Graph {
    var g Graph
    g.connections = make(map[Vertex][]Vertex)
    return &g
}

Cette fonction renvoie un nouvelle instance Graph avec une carte de connexions initialisée.

Solution : add_connection Méthode

Une autre option consiste à implémenter une méthode add_connection qui initialise la carte si elle est vide :

func (g *Graph) add_connection(v1, v2 Vertex) {
  if g.connections == nil {
    g.connections = make(map[Vertex][]Vertex)
  }
  g.connections[v1] = append(g.connections[v1], v2)
  g.connections[v2] = append(g.connections[v2], v1)
}

Cette méthode vérifie si la carte est nulle et l'initialise si nécessaire avant d'ajouter des connexions .

Exemple de la bibliothèque standard

La bibliothèque standard fournit un exemple d'initialisation d'une structure avec une tranche à l'aide d'un constructeur dans le package image/jpeg :

type Alpha struct {
    Pix []uint8
    Stride int
    Rect Rectangle
}

func NewAlpha(r Rectangle) *Alpha {
    w, h := r.Dx(), r.Dy()
    pix := make([]uint8, 1*w*h)
    return &Alpha{pix, 1 * w, r}
}

Dans l'ensemble, le choix de la méthode d'initialisation dépend du cas d'utilisation spécifique. Les constructeurs offrent un moyen pratique de garantir une initialisation correcte, tandis que les méthodes permettent plus de flexibilité dans la gestion des cas exceptionnels.

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