Maison > développement back-end > Golang > Comment le modèle de constructeur peut-il résoudre les problèmes d'initialisation de Go Struct ?

Comment le modèle de constructeur peut-il résoudre les problèmes d'initialisation de Go Struct ?

Linda Hamilton
Libérer: 2024-12-02 04:04:14
original
730 Les gens l'ont consulté

How Can the Constructor Pattern Solve Go Struct Initialization Problems?

Modèle de constructeur pour initialiser les structures Go

L'allocation et l'initialisation des structures Go peuvent être délicates pour les nouveaux arrivants. Prenons cet exemple :

import "sync"

type SyncMap struct {
    lock *sync.RWMutex
    hm  map[string]string
}

func (m *SyncMap) Put(k, v string) {
    m.lock.Lock()
    defer m.lock.Unlock()

    m.hm[k] = v
}

func main() {
    sm := new(SyncMap)
    sm.Put("Test", "Test")
}
Copier après la connexion

Ce code paniquera avec une exception de pointeur nul car lock et hm ne sont pas initialisés.

Pour résoudre ce problème, la solution de contournement suivante peut être utilisée :

func (m *SyncMap) Init() {
    m.hm = make(map[string]string)
    m.lock = new(sync.RWMutex)
}

func main() {
    sm := new(SyncMap)
    sm.Init()
    sm.Put("Test", "Test")
}
Copier après la connexion

Mais cela ajoute un passe-partout inutile.

Le modèle de constructeur

Une approche plus propre est utiliser une fonction constructeur pour initialiser la structure. Un constructeur est une fonction qui renvoie une instance initialisée d'une structure. Par exemple :

func NewSyncMap() *SyncMap {
    return &SyncMap{hm: make(map[string]string)}
}
Copier après la connexion

Ce constructeur initialise le champ hm et renvoie un pointeur vers l'instance SyncMap nouvellement créée.

func main() {
    sm := NewSyncMap()
    sm.Put("Test", "Test")
}
Copier après la connexion

Maintenant, le code initialise correctement la structure sans aucun passe-partout. .

Le modèle de constructeur peut également être utilisé pour initialiser plusieurs champs, démarrer des goroutines ou enregistrer des finaliseurs pour le structurer. Par exemple :

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

Ce constructeur initialise les champs hm et foo, démarre une goroutine pour backend() et enregistre un finaliseur pour exécuter la méthode stop() lorsque l'instance SyncMap est récupérée.

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