Go에서 생성자를 사용하여 구조체 멤버 초기화
특히 초보자의 경우 구조체 멤버를 초기화하는 것이 어려울 수 있습니다. 새 구조체 인스턴스("sm")를 생성하고 이에 대한 함수("sm.Put")를 호출하면 nil 포인터로 인해 패닉이 발생하는 문제를 자세히 살펴보겠습니다.
문제:
<사전>
가져오기 "sync"
type SyncMap struct {
lock *sync.RWMutex hm map[string]string
}
func(m *SyncMap) Put(k, v 문자열) {
m.lock.Lock() defer m.lock.Unlock() m.hm[k] = v, true
}
func 메인() {
sm := new(SyncMap) sm.Put("Test, "Test") // Panic
}
lock 및 hm 필드가 모두 초기화되지 않았기 때문에 이 코드는 실패합니다.
해결 방법(Not 이상적):
한 가지 해결 방법은 Init 기능을 추가하고 수동으로 인스턴스를 생성한 후 필드를 초기화합니다.
<br>func (m *SyncMap) Init() {</p> <pre class="brush:php;toolbar:false"> m.hm = make(map[string]string) m.lock = new(sync.RWMutex)
}
우아한 솔루션: 생성자
더 나은 접근 방식은 생성자 함수를 사용하여 구조체를 초기화하는 것입니다.
<br>func NewSyncMap() *SyncMap {</p> <pre class="brush:php;toolbar:false">return &SyncMap{hm: make(map[string]string)}
}
NewSyncMap()을 호출하면 초기화된 멤버로 새 인스턴스를 생성할 수 있습니다.
고급 생성자:
더 복잡한 구조체의 경우 생성자 고루틴 시작 또는 종료자 등록과 같은 다른 초기화 작업을 수행할 수 있습니다:
<br>func NewSyncMap() *SyncMap {</p> <pre class="brush:php;toolbar:false">sm := SyncMap{ hm: make(map[string]string), foo: "Bar", } runtime.SetFinalizer(sm, (*SyncMap).stop) go sm.backend() return &sm
}
결론:
생성자는 구조체 멤버를 초기화하는 우아하고 유연한 방법을 제공합니다. . 이를 활용하면 새 구조체 인스턴스 생성을 간소화하고, 포인터 패닉을 제거하고, 복잡한 데이터 구조의 초기화 프로세스를 단순화할 수 있습니다.
위 내용은 생성자는 Go 구조체를 초기화할 때 Nil 포인터 패닉을 어떻게 해결할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!