54 votes

comment initialiser les membres dans go struct

Je suis nouveau sur golang, donc mon affectation me rend fou:

 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, true
}
 

et plus tard, j'appelle:

 sm := new(SyncMap)
sm.Put("Test, "Test")
 

En ce moment, je suis pris de panique.

J'ai travaillé dessus en utilisant une autre fonction et en l'appelant juste après new ():

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

Mais je me demande s’il est possible de supprimer cette initialisation standard.

66voto

Mue Points 2469

Vous avez juste besoin d'un constructeur. Un modèle couramment utilisé est

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

Dans le cas où il y aurait plus de champs dans votre structure, en commençant par goroutine en tant que back-end ou en enregistrant un finaliseur, tout pourrait être fait dans ce constructeur.

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

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

    go sm.backend()

    return sm
}
 

9voto

deamon Points 15181

La solution de 'Mue' ne fonctionne pas car le mutex n'est pas initialisé. La modification suivante fonctionne:

 package main

import "sync"

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

func NewSyncMap() *SyncMap {
        return &SyncMap{lock: new(sync.RWMutex), hm: make(map[string]string)}
}

func (m *SyncMap) Put (k, v string) {
        m.lock.Lock()
        defer m.lock.Unlock()
        m.hm[k] = v
}

func main() {
    sm := NewSyncMap()
    sm.Put("Test", "Test")
}
 

http://play.golang.org/p/n-jQKWtEy5

5voto

Sonia Points 6077

Bonne prise par le démon. Mue était peut-être la pensée de la plus commune de patron de notamment les de verrouillage comme une valeur plutôt qu'un pointeur. Depuis le zéro de la valeur d'un Mutex est un prêt-à-utiliser déverrouillé Mutex, il ne nécessite pas d'initialisation et dont une en tant que valeur commune. Comme la poursuite de la simplification, vous pouvez l'intégrer en omettant le nom du champ. Votre struct puis acquiert la méthode du Mutex. Voir cet exemple de travail, http://play.golang.org/p/faO9six-Qx. Aussi j'ai pris de l'utilisation de reporter. Dans une certaine mesure, c'est une question de préférence et le style de codage, mais depuis il a une petite surcharge, j'ai tendance à ne pas l'utiliser dans de petites fonctions, surtout si il n'y a pas de code conditionnel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X