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
Barbara Streisandoriginal
2024-12-01 06:39:09543parcourir

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>
<pre class="brush:php;toolbar:false">    lock *sync.RWMutex
    hm map[string]string

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

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

    m.hm[k] = v, true

}

func main() {

    sm := new(SyncMap)
    sm.Put("Test, "Test") // Panic

}

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>
<pre class="brush:php;toolbar:false">    m.hm = make(map[string]string)
    m.lock = new(sync.RWMutex)

}

Solution élégante : utiliser un constructeur

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

<br>func NewSyncMap() *SyncMap {</p>
<pre class="brush:php;toolbar:false">return &amp;SyncMap{hm: make(map[string]string)}

}

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>
<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

}

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!

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