Lorsque vous travaillez avec Go, l'initialisation des structures peut être un peu délicate, en particulier pour les débutants. Voici un scénario classique que vous pourriez rencontrer :
package main import "sync" type SyncMap struct { lock sync.RWMutex hm map[string]string } func main() { sm := &SyncMap{} // Initializing with the default zero value sm.Put("Test", "Test") // Attempting to access an uninitialized field }
Dans le code ci-dessus, lorsque nous essayons d'appeler sm.Put(), cela panique à cause d'une exception de pointeur nul. La raison en est que les champs lock et hm de la structure SyncMap ont tous deux une valeur nulle par défaut, ce qui donne des valeurs nulles.
Pour résoudre ce problème, nous utilisons généralement une fonction passe-partout Init() qui initialise explicitement ces champs. :
func (m *SyncMap) Init() { m.hm = make(map[string]string) m.lock = &sync.RWMutex{} }
Cependant, ne serait-il pas plus pratique s'il existait un moyen d'éliminer ce manuel initialisation ?
Entrez les constructeurs.
Go prend en charge l'utilisation de constructeurs pour initialiser automatiquement les membres de la structure lors de la création d'un objet. Voici à quoi cela ressemble :
func NewSyncMap() *SyncMap { return &SyncMap{hm: make(map[string]string)} }
En définissant un constructeur NewSyncMap(), vous pouvez désormais initialiser une instance SyncMap avec les champs requis renseignés :
sm := NewSyncMap()
Constructeurs améliorés
Les constructeurs peuvent également être utilisés pour effectuer des tâches supplémentaires au-delà de la simple initialisation de champ. Par exemple, vous pouvez démarrer une goroutine backend ou enregistrer un finaliseur :
func NewSyncMap() *SyncMap { sm := SyncMap{ hm: make(map[string]string), foo: "Bar", } runtime.SetFinalizer(sm, (*SyncMap).stop) go sm.backend() return &sm }
Conclusion
L'utilisation de constructeurs est une technique polyvalente et pratique pour initialiser les structures Go. Ils fournissent un emplacement centralisé pour l'initialisation des objets, éliminant le besoin de fonctions passe-partout Init() et garantissant une initialisation cohérente dans toute l'application.
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!