在 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中文网其他相关文章!