Maison > développement back-end > Golang > Comment les constructeurs peuvent-ils améliorer l'initialisation de Go Struct et empêcher les paniques du pointeur Nil ?

Comment les constructeurs peuvent-ils améliorer l'initialisation de Go Struct et empêcher les paniques du pointeur Nil ?

Susan Sarandon
Libérer: 2024-12-02 14:45:12
original
567 Les gens l'ont consulté

How Can Constructors Improve Go Struct Initialization and Prevent Nil Pointer Panics?

Modèle de constructeur pour l'initialisation de structure dans Go

Lorsque vous travaillez avec des structures Golang, l'initialisation des membres peut parfois être un peu délicate, en particulier pour les nouveaux arrivants. Un problème courant est la panique du pointeur nul lors de l'accès à des champs non initialisés.

Pour résoudre ce problème, une approche populaire consiste à utiliser une fonction distincte pour l'initialisation. Dans votre exemple avec SyncMap, vous avez dû créer une fonction Init() pour initialiser manuellement les champs hm et verrouiller après avoir créé la structure à l'aide de new.

Cependant, il existe une manière plus élégante de gérer l'initialisation de la structure dans Go : en utilisant un constructeur. Un constructeur est une fonction qui prend les paramètres nécessaires pour créer une instance d'une structure et initialise tous ses membres.

Pour votre exemple SyncMap, vous pouvez définir un constructeur comme ceci :

func NewSyncMap() *SyncMap {
    return &SyncMap{hm: make(map[string]string)}
}
Copier après la connexion

Ce constructeur crée une nouvelle structure SyncMap, initialise le champ hm sur une carte vide et renvoie un pointeur vers le struct.

Maintenant, vous pouvez simplement utiliser NewSyncMap() pour créer des instances SyncMap initialisées, sans avoir besoin d'une initialisation manuelle :

sm := NewSyncMap()
sm.Put("Test", "Test")
Copier après la connexion

Ce modèle de constructeur peut être étendu pour gérer des instances plus complexes. scénarios d'initialisation, tels que le démarrage de goroutines en arrière-plan ou l'enregistrement de finaliseurs :

func NewSyncMap() *SyncMap {
    sm := SyncMap{
        hm: make(map[string]string),
        foo: "Bar",
    }

    runtime.SetFinalizer(sm, (*SyncMap).stop)

    go sm.backend()

    return &sm
}
Copier après la connexion

En utilisant des constructeurs, vous pouvez vous assurer que votre Les structures Go sont toujours correctement initialisées et prêtes à être utilisées, sans avoir besoin de code passe-partout supplémentaire ni risque de rencontrer des paniques de pointeur nul.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal