首页 > 后端开发 > Golang > 正文

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!