Jestem nowy Golang więc przydział w to czyni mnie szalony:jak zainicjować członkowie Przejdź struct
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
}
a później, po prostu zadzwoń:
sm := new(SyncMap)
sm.Put("Test, "Test")
W tej chwili mogę dostać zero paniki paniki.
Pracowałem wokół niego za pomocą innego jedną funkcję, a nazywając ją tuż po new()
:
func (m *SyncMap) Init() {
m.hm = make(map[string]string)
m.lock = new(sync.RWMutex)
}
Ale zastanawiam się, czy to możliwe, aby pozbyć się tego boilerplate inicjalizacji?
Wielkie dzięki! Teraz pamiętam, że było coś o konstruktorze w tutorialu, ale będąc devdelerem Java, pomyślałem, że powinien on być powiązany z nowym operatorem, a nie z Nową ... konwencją kodu –
To zadziała, ale nie jest najlepszą radą. RWMutex powinien być zawarty jako wartość, a nie jako wskaźnik. Jego wartość zerowa jest gotowym do użycia muteksem, w ten sposób można uniknąć jawnej funkcji konstruktora. – kelnos
Powinny mieć różne nazwy, ponieważ jest to tylko przykład. Jak zobaczysz, inicjuję również pole 'foo', które nie jest częścią oryginalnej struktury. ;) – Mue