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
}
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> <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)
}
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 &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> <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 &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!