ホームページ  >  記事  >  バックエンド開発  >  Golang でインターフェイスを Nil に設定する方法: ポインタとインターフェイスの Nil の違いは何ですか?

Golang でインターフェイスを Nil に設定する方法: ポインタとインターフェイスの Nil の違いは何ですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-31 10:08:02138ブラウズ

How to Set an Interface to Nil in Golang: What's the Difference Between Nil a Pointer and an Interface?

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 サイトの他の関連記事を参照してください。

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