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 サイトの他の関連記事を参照してください。