Go 구조체를 할당하고 초기화하는 것은 초보자에게 까다로울 수 있습니다. 다음 예를 고려해 보세요.
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") }
lock 및 hm이 초기화되지 않았기 때문에 이 코드는 nil 포인터 예외로 인해 패닉이 발생합니다.
이 문제를 해결하려면 다음 해결 방법을 사용할 수 있습니다.
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") }
하지만 이는 불필요한 상용구를 추가합니다.
더 깔끔한 접근 방식은 생성자 함수를 사용하여 구조체를 초기화하는 것입니다. 생성자는 구조체의 초기화된 인스턴스를 반환하는 함수입니다. 예:
func NewSyncMap() *SyncMap { return &SyncMap{hm: make(map[string]string)} }
이 생성자는 hm 필드를 초기화하고 새로 생성된 SyncMap 인스턴스에 대한 포인터를 반환합니다.
func main() { sm := NewSyncMap() sm.Put("Test", "Test") }
이제 코드는 상용구 없이 구조체를 올바르게 초기화합니다. .
생성자 패턴을 사용하여 여러 필드를 초기화하거나, 고루틴을 시작하거나, 구조체에 대한 종료자를 등록할 수도 있습니다. 예:
func NewSyncMap() *SyncMap { sm := SyncMap{ hm: make(map[string]string), foo: "Bar", } runtime.SetFinalizer(sm, (*SyncMap).stop) go sm.backend() return &sm }
이 생성자는 hm 및 foo 필드를 모두 초기화하고, backend()에 대한 goroutine을 시작하며, SyncMap 인스턴스가 가비지 수집될 때 stop() 메서드를 실행하도록 종료자를 등록합니다.
위 내용은 생성자 패턴은 Go 구조체 초기화 문제를 어떻게 해결할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!