Go 構造体のメンバーを初期化するコンストラクター
Go を初めて使用する開発者は、構造体に関する初期化の課題に遭遇することがよくあります。次の点を考慮してください:
import "sync" type SyncMap struct { lock *sync.RWMutex hm map[string]string }
sm := new(SyncMap) でこの構造体をインスタンス化すると、残念ながら nil ポインターが原因でパニックが発生します。
ヘルパー関数を使用して nil ポインターを克服する
パニックを回避するための別のアプローチは、初期化:
func (m *SyncMap) Init() { m.hm = make(map[string]string) m.lock = new(sync.RWMutex) }
構造体をインスタンス化した後、手動で Init を呼び出す必要があります。これにより定型コードが導入されます。
初期化を簡略化するためのコンストラクターの導入
より洗練された解決策は、コンストラクター関数を使用することです。次の例を考えてみましょう。
func NewSyncMap() *SyncMap { return &SyncMap{hm: make(map[string]string)} }
この関数は、必要な構造体のメンバーを初期化し、初期化された構造体へのポインターを返します。使用法は簡単です:
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 }
コンストラクターを活用することで、Go 開発者は次のことができます。構造体の初期化を簡素化し、定型コードを排除し、コードベースの保守性と可読性を向上させます。
以上がコンストラクターはどうすれば Go 構造体の初期化を簡素化し、Nil ポインター パニックを回避できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。