Golang でインターフェイスを無効にするにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-01 21:11:02
オリジナル
243 人が閲覧しました

How do you nullify an interface in Golang?

Golang でインターフェイスを無効にする

問題:

の内部値を無効にしようとしていますインターフェースは、そのような関数 setNil(typ Interface{}) をどのように実装するか?

答え:

インターフェースを効果的に無効化するには、次のことが重要です。ポインター値の操作は、インターフェイス値の操作とは異なることに注意してください。ポインタは参照によって渡されるため、内部状態を変更するにはインターフェイスへのポインタを渡す必要があります。

インターフェイスの無効化関数{}:

<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>
ログイン後にコピー

ポインターの無効化関数 (Unsafe.Pointer):

ポインタを無効にするには、unsafe.Pointer に変換して逆参照できます:

<code class="go">func setNilPtr(p unsafe.Pointer) {
    *(**int)(p) = nil
}</code>
ログイン後にコピー

使用法:

<code class="go">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 を直接割り当てることをお勧めします。

<code class="go">i = nil
typ = nil</code>
ログイン後にコピー

以上がGolang でインターフェイスを無効にするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!