ホームページ > バックエンド開発 > Golang > コンストラクター パターンは Go 構造体の初期化問題をどのように解決できますか?

コンストラクター パターンは Go 構造体の初期化問題をどのように解決できますか?

Linda Hamilton
リリース: 2024-12-02 04:04:14
オリジナル
730 人が閲覧しました

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")
}
ログイン後にコピー

ロックと 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")
}
ログイン後にコピー

しかし、これにより不必要な定型文が追加されます。

コンストラクターPattern

よりクリーンなアプローチは、コンストラクター関数を使用して構造体を初期化することです。コンストラクターは、構造体の初期化されたインスタンスを返す関数です。例:

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() のゴルーチンを開始し、SyncMap インスタンスがガベージ コレクションされたときに stop() メソッドを実行するファイナライザーを登録します。

以上がコンストラクター パターンは Go 構造体の初期化問題をどのように解決できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート