ホームページ >バックエンド開発 >Golang >Go Struct メンバーを効率的に初期化するにはどうすればよいですか?

Go Struct メンバーを効率的に初期化するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-01 02:09:09603ブラウズ

How Can I Efficiently Initialize Go Struct Members?

Go 構造体でのメンバーの初期化

Go を使用する場合、特に初心者にとって、構造体の初期化は少し難しい場合があります。以下に、遭遇する可能性のある古典的なシナリオを示します。

package main

import "sync"

type SyncMap struct {
        lock sync.RWMutex
        hm map[string]string
}

func main() {
        sm := &SyncMap{}  // Initializing with the default zero value
        sm.Put("Test", "Test")  // Attempting to access an uninitialized field
}

上記のコードでは、sm.Put() を呼び出そうとすると、nil ポインター例外によりパニックが発生します。この理由は、SyncMap 構造体のフィールド lock と hm がデフォルトで両方ともゼロ値であり、その結果 nil 値になるためです。

これを修正するには、通常、これらのフィールドを明示的に初期化する定型的な Init() 関数を使用します。 :

func (m *SyncMap) Init() {
        m.hm = make(map[string]string)
        m.lock = &sync.RWMutex{}
}

しかし、このマニュアルをなくす方法があればもっと便利ではないでしょうか

コンストラクターを入力してください。

Go は、オブジェクトの作成中に構造体のメンバーを自動的に初期化するコンストラクターの使用をサポートしています。以下はその様子です:

func NewSyncMap() *SyncMap {
    return &SyncMap{hm: make(map[string]string)}
}

NewSyncMap() コンストラクターを定義することで、必要なフィールドが設定された SyncMap インスタンスを初期化できるようになりました:

sm := NewSyncMap()

拡張コンストラクター

コンストラクターは、単純なフィールドを超える追加のタスクを実行するために使用することもできます初期化。たとえば、バックエンドの goroutine を開始したり、ファイナライザーを登録したりできます。

func NewSyncMap() *SyncMap {
    sm := SyncMap{
        hm: make(map[string]string),
        foo: "Bar",
    }

    runtime.SetFinalizer(sm, (*SyncMap).stop)

    go sm.backend()

    return &sm
}

結論

コンストラクターの使用は、Go 構造体を初期化するための多用途で便利な手法です。これらはオブジェクト初期化の一元的な場所を提供し、定型的な Init() 関数の必要性を排除し、アプリケーション全体で一貫した初期化を保証します。

以上がGo Struct メンバーを効率的に初期化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。