>백엔드 개발 >Golang >생성자는 Go 구조체를 초기화할 때 Nil 포인터 패닉을 어떻게 해결할 수 있나요?

생성자는 Go 구조체를 초기화할 때 Nil 포인터 패닉을 어떻게 해결할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-12-01 06:39:09475검색

How Can Constructors Solve Nil Pointer Panics When Initializing Go Structs?

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 &amp;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 &amp;sm

}

결론:

생성자는 구조체 멤버를 초기화하는 우아하고 유연한 방법을 제공합니다. . 이를 활용하면 새 구조체 인스턴스 생성을 간소화하고, 포인터 패닉을 제거하고, 복잡한 데이터 구조의 초기화 프로세스를 단순화할 수 있습니다.

위 내용은 생성자는 Go 구조체를 초기화할 때 Nil 포인터 패닉을 어떻게 해결할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.