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