Golang では、インターフェイス値を nil に設定するのは予想ほど簡単ではない場合があります。この記事では、さまざまなシナリオでインターフェイスとポインターを nil に設定する方法について説明します。
インターフェイスを Nil に設定する
インターフェイス値、特に次の値を保持するインターフェイスを扱う場合具象型の場合、正しいアプローチは、インターフェイス値自体ではなくインターフェイスへのポインターを渡すことです。インターフェイスを nil に設定するには、次のようなインターフェイス ポインターを受け入れる関数を使用します。
<code class="go">func setNilIf(v *interface{}) { *v = nil }</code>
例:
<code class="go">var i interface{} = "Bob" setNilIf(&i) fmt.Println(i) // Prints <nil></code>
ポインターを Nil に設定する
ポインター値の設定を解除するには、もう少し手間がかかります。ポインタは本質的にメモリ アドレスであるため、実際に値を変更するにはポインタを逆参照する必要があります。 unsafe.Pointer を直接逆参照できないため、これにより問題が発生します。これを解決するには、次の関数を使用します。
<code class="go">func setNilPtr(p unsafe.Pointer) { *(**int)(p) = nil }</code>
例:
<code class="go">typ := &TYP{InternalState: "filled"} fmt.Println(typ) // Prints &{filled} setNilPtr(unsafe.Pointer(&typ)) fmt.Println(typ) // Prints <nil></code>
注: 簡単にするために、この例では int を次のように使用します。逆参照のターゲットの型。任意のポインタ タイプをターゲットとして使用できます。
または、リフレクションを使用してポインタを nil にすることもできます:
<code class="go">func setNilPtr2(i interface{}) { v := reflect.ValueOf(i) v.Elem().Set(reflect.Zero(v.Elem().Type())) }</code>
例:
<code class="go">typ2 := &TYP{InternalState: "filled"} fmt.Println(typ2) // Prints &{filled} setNilPtr2(typ2) fmt.Println(typ2) // Prints <nil></code>
ベスト プラクティス
上記の手法ではインターフェイスとポインターを nil に設定する方法が提供されていますが、単純に値に nil を割り当てるという慣用的なアプローチを使用するのが最善です。例:
<code class="go">// Set interface to nil i = nil // Set pointer to nil typ = nil</code>
以上が記事の本質を捉えた、質問ベースのタイトルをいくつか紹介します。 * Golang でインターフェイスまたはポインタを Nil に設定するにはどうすればよいですか? * Golang Nil の割り当て: インターフェイスとポインター: 何が違うのかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。