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

コンストラクターは Go 構造体を初期化する際の Nil ポインター パニックをどのように解決できますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-01 06:39:09467ブラウズ

How Can Constructors Solve Nil Pointer Panics When Initializing Go Structs?

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)

}

エレガントな解決策: Constructor

より良い方法は、コンストラクター関数を使用して構造体を初期化することです:

<br>func NewSyncMap() *SyncMap {</p>
<pre class="brush:php;toolbar:false">return &amp;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 &amp;sm

}

結論:

コンストラクターは、構造体のメンバーを初期化するエレガントで柔軟な方法を提供します。これらを活用することで、新しい構造体インスタンスの作成を合理化し、nil ポインター パニックを排除し、複雑なデータ構造の初期化プロセスを簡素化できます。

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

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