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

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

Barbara Streisand
リリース: 2024-12-01 06:39:09
オリジナル
543 人が閲覧しました

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

Go でコンストラクターを使用して構造体メンバーを初期化する

構造体メンバーの初期化は、特に初心者にとって難しい場合があります。新しい構造体インスタンス (「sm」) を作成し、そのインスタンスで関数を呼び出す (「sm.Put」) と nil ポインターが原因でパニックが発生する問題を詳しく調べてみましょう。

問題:

<br>インポート"sync"</p>
<p>type SyncMap struct {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><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>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">    m.hm = make(map[string]string)
    m.lock = new(sync.RWMutex)
ログイン後にコピー

}

エレガントな解決策: Constructor

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

<br>func NewSyncMap() *SyncMap {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">return &amp;SyncMap{hm: make(map[string]string)}
ログイン後にコピー

}

NewSyncMap() を呼び出すことで、初期化されたメンバーで新しいインスタンスを作成できます。

高度なコンストラクター:

より複雑な構造体の場合、コンストラクターは、ゴルーチンの開始やファイナライザーの登録など、他の初期化タスクを実行できます。

<br>func NewSyncMap() *SyncMap {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><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 サイトの他の関連記事を参照してください。

ソース:php.cn
前の記事:Go で複数の GOPATH ディレクトリを効果的に管理するにはどうすればよいですか? 次の記事:Linux および macOS 上でターミナル (TTY) を模倣するプログラムを作成するにはどうすればよいですか?
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
最新の問題
関連トピック
詳細>
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート