首页 > 后端开发 > Golang > 如何在 Golang 中将接口设置为 Nil:Nil 指针和接口有什么区别?

如何在 Golang 中将接口设置为 Nil:Nil 指针和接口有什么区别?

Susan Sarandon
发布: 2024-10-31 10:08:02
原创
283 人浏览过

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

在 Golang 中将 Interface 设置为 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>
登录后复制

无指针

在您的情况下,您正在处理指向具体类型的指针。要使指针为零,您可以使用:

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板