Maison > développement back-end > Golang > Comment puis-je initialiser efficacement les membres Go Struct ?

Comment puis-je initialiser efficacement les membres Go Struct ?

Susan Sarandon
Libérer: 2024-12-01 02:09:09
original
599 Les gens l'ont consulté

How Can I Efficiently Initialize Go Struct Members?

Initialisation des membres dans les structures Go

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
}
Copier après la connexion

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{}
}
Copier après la connexion

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)}
}
Copier après la connexion

En définissant un constructeur NewSyncMap(), vous pouvez désormais initialiser une instance SyncMap avec les champs requis renseignés :

sm := NewSyncMap()
Copier après la connexion

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
}
Copier après la connexion

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!

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