>백엔드 개발 >Golang >생성자 패턴은 Go 구조체 초기화 문제를 어떻게 해결할 수 있나요?

생성자 패턴은 Go 구조체 초기화 문제를 어떻게 해결할 수 있나요?

Linda Hamilton
Linda Hamilton원래의
2024-12-02 04:04:14734검색

How Can the Constructor Pattern Solve Go Struct Initialization Problems?

Go 구조체 초기화를 위한 생성자 패턴

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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