Go でコンストラクターを使用して構造体メンバーを初期化する
構造体メンバーの初期化は、特に初心者にとって難しい場合があります。新しい構造体インスタンス (「sm」) を作成し、そのインスタンスで関数を呼び出す (「sm.Put」) と nil ポインターが原因でパニックが発生する問題を詳しく調べてみましょう。
問題:
<br>インポート"sync"</p> <p>type SyncMap struct {</p> <pre class="brush:php;toolbar:false"> 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, true
}
関数 main() {
sm := new(SyncMap) sm.Put("Test, "Test") // Panic
}
lock フィールドと hm フィールドの両方が初期化されていないため、このコードは失敗します。
回避策 (そうではありません)理想):
回避策の 1 つは、Init を追加することでした
<br>func (m *SyncMap) Init() {</p> <pre class="brush:php;toolbar:false"> m.hm = make(map[string]string) m.lock = new(sync.RWMutex)
}
pre>
エレガントな解決策: Constructor
より良い方法は、コンストラクター関数を使用して構造体を初期化することです:
<br>func NewSyncMap() *SyncMap {</p> <pre class="brush:php;toolbar:false">return &SyncMap{hm: make(map[string]string)}
}
NewSyncMap() を呼び出すことで、初期化されたメンバーで新しいインスタンスを作成できます。
高度なコンストラクター:
より複雑な構造体の場合、コンストラクターは、ゴルーチンの開始やファイナライザーの登録など、他の初期化タスクを実行できます。
<br>func NewSyncMap() *SyncMap {</p> <pre class="brush:php;toolbar:false">sm := SyncMap{ hm: make(map[string]string), foo: "Bar", } runtime.SetFinalizer(sm, (*SyncMap).stop) go sm.backend() return &sm
}
結論:
コンストラクターは、構造体のメンバーを初期化するエレガントで柔軟な方法を提供します。これらを活用することで、新しい構造体インスタンスの作成を合理化し、nil ポインター パニックを排除し、複雑なデータ構造の初期化プロセスを簡素化できます。
以上がコンストラクターは Go 構造体を初期化する際の Nil ポインター パニックをどのように解決できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。