Maison >développement back-end >Golang >Comment les constructeurs peuvent-ils simplifier l'initialisation de Go Struct et éviter les paniques du pointeur Nil ?

Comment les constructeurs peuvent-ils simplifier l'initialisation de Go Struct et éviter les paniques du pointeur Nil ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-08 11:02:11441parcourir

How Can Constructors Simplify Go Struct Initialization and Avoid Nil Pointer Panics?

Constructeur pour initialiser les membres de Go Struct

Les développeurs qui débutent sur Go rencontrent souvent des défis d'initialisation avec les structures. Considérez ce qui suit :

import "sync"

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

Instancier cette structure avec sm := new(SyncMap) provoque malheureusement une panique en raison de pointeurs nuls.

Surmonter les pointeurs nuls avec une fonction d'assistance

Pour éviter la panique, une approche alternative consiste à utiliser une fonction distincte pour initialisation :

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

Après avoir instancié la structure, il faut alors appeler manuellement Init. Cela introduit le code passe-partout.

Présentation des constructeurs pour simplifier l'initialisation

Une solution plus élégante consiste à utiliser une fonction constructeur. Prenons cet exemple :

func NewSyncMap() *SyncMap {
    return &SyncMap{hm: make(map[string]string)}
}

Cette fonction initialise les membres de la structure nécessaires et renvoie un pointeur vers la structure initialisée. L'utilisation est simple :

sm := NewSyncMap()
sm.Put("Test", "Test")

Constructeurs améliorés pour les structures complexes

Pour les structures comportant plus de membres, les constructeurs peuvent être étendus pour gérer des tâches d'initialisation supplémentaires, telles que le démarrage de goroutines. ou en enregistrant les finaliseurs :

func NewSyncMap() *SyncMap {
    sm := SyncMap{
        hm: make(map[string]string),
        foo: "Bar",
    }

    runtime.SetFinalizer(sm, (*SyncMap).stop)

    go sm.backend()

    return &sm
}

En tirant parti des constructeurs, les développeurs Go peuvent simplifier l'initialisation des structures, éliminer code passe-partout, et améliorer la maintenabilité et la lisibilité de leur base de code.

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