Maison > développement back-end > Golang > Comment les constructeurs peuvent-ils résoudre les paniques de pointeur nul lors de l'initialisation de Go Structs ?

Comment les constructeurs peuvent-ils résoudre les paniques de pointeur nul lors de l'initialisation de Go Structs ?

Barbara Streisand
Libérer: 2024-12-01 06:39:09
original
465 Les gens l'ont consulté

How Can Constructors Solve Nil Pointer Panics When Initializing Go Structs?

Utiliser des constructeurs pour initialiser les membres de la structure dans Go

L'initialisation des membres de la structure peut être difficile, en particulier pour les débutants. Examinons un problème dans lequel la création d'une nouvelle instance de structure ("sm") et l'appel d'une fonction dessus ("sm.Put") ont entraîné une panique due à un pointeur nul.

Problème :

<br>importer "sync"</p>
<p>type SyncMap struct {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">    lock *sync.RWMutex
    hm map[string]string
Copier après la connexion

}
func (m *SyncMap) Put (k, v chaîne) {

    m.lock.Lock()
    defer m.lock.Unlock()

    m.hm[k] = v, true
Copier après la connexion

}

func main() {

    sm := new(SyncMap)
    sm.Put("Test, "Test") // Panic
Copier après la connexion

}

Ce code échoue car les champs lock et hm ne sont pas initialisés.

Solution de contournement (pas idéale) :

Une solution de contournement consistait à ajouter une fonction Init et à initialiser manuellement les champs après avoir créé le instance :

<br>func (m *SyncMap) Init() {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">    m.hm = make(map[string]string)
    m.lock = new(sync.RWMutex)
Copier après la connexion

}

Solution élégante : utiliser un constructeur

Une meilleure approche consiste à utiliser un fonction constructeur pour initialiser la struct :

<br>func NewSyncMap() *SyncMap {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">return &amp;SyncMap{hm: make(map[string]string)}
Copier après la connexion

}

En appelant NewSyncMap(), vous pouvez créer une nouvelle instance avec des membres initialisés.

Constructeur avancé :

Pour des structures plus complexes, les constructeurs peuvent effectuer d'autres tâches d'initialisation, telles que démarrer des goroutines ou enregistrer des finaliseurs :

<br>func NewSyncMap() *SyncMap {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">sm := SyncMap{
    hm: make(map[string]string),
    foo: "Bar",
}

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

go sm.backend()

return &amp;sm
Copier après la connexion

}

Conclusion :

Les constructeurs offrent un moyen élégant et flexible d'initialiser les membres d'une structure . En les tirant parti, vous pouvez rationaliser la création de nouvelles instances de structure, éliminer les paniques de pointeur nul et simplifier le processus d'initialisation des structures de données complexes.

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
Article précédent:Comment puis-je gérer efficacement plusieurs répertoires GOPATH dans Go ? Article suivant:Comment puis-je créer un programme qui imite un terminal (TTY) sous Linux et macOS ?
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
Derniers numéros
Rubriques connexes
Plus>
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal