Golang でインターフェイスを Nil に設定する
Golang では、インターフェイス値はオブジェクトの動作を表しますが、実際のオブジェクト自体ではありません。インターフェイスの内部値を nil にしようとすると、実際にはインターフェイスの値とは異なる具象型へのポインタを扱うことになります。
インターフェイスの Nil
値を nil に設定したいインターフェースがある場合は、次の関数を使用します:
<code class="go">func setNilIf(v *interface{}) { *v = nil }</code>
例:
<code class="go">var i interface{} = "Bob" fmt.Printf("Before: %v\n", i) setNilIf(&i) fmt.Printf("After: %v\n", i)</code>
出力:
Before: Bob After: <nil>
Nil a Pointer
あなたの場合、具体的な型へのポインターを扱っています。ポインターを nil にするには、次を使用できます。
Using Unsafe.Pointer:
<code class="go">func setNilPtr(p unsafe.Pointer) { *(**int)(p) = nil }</code>
例:
<code class="go">type TYP struct { InternalState string } typ := &TYP{InternalState: "filled"} fmt.Printf("Before: %v\n", typ) setNilPtr(unsafe.Pointer(&typ)) fmt.Printf("After: %v\n", typ)</code>
出力:
Before: &{filled} After: <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.Printf("Before: %v\n", typ2) setNilPtr2(&typ2) fmt.Printf("After: %v\n", typ2)</code>
出力:
Before: &{filled} After: <nil>
注:
簡略化のため、一般的にポインタ変数に nil を直接代入することをお勧めします。上記のような複雑な方法を使用するのではなく。
以上がGolang でインターフェイスを Nil に設定する方法: ポインタとインターフェイスの Nil の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。