go - 在 Golang 中 nil 接口值如何工作
问题描述
当golang接口值为false时,我有以下代码来测试。
package main
import (
"fmt"
)
func Foo(x interface{}) {
fmt.Println("33, x == nil = ", x == nil)
}
func main() {
var x *int = nil
fmt.Println("11, x == nil = ", x == nil)
var a interface{}
fmt.Println(22, &a, &a == nil, a == nil) // 0xc0000935c0 false true
Foo(x)
}
结果是
11, x == nil = true
22 0xc00010a040 false true
33, x == nil = false
我不明白输出。特别是,我不明白为什么&a
不是 nil 因为 a 没有初始化。有没有人可以帮我解释结果?谢谢。
解决方案
在 go 中,当涉及到接口 nil 值时,您需要记住两点:
- 一个不包含任何值的 nil 接口值与包含一个恰好为 nil 的值的接口值不同。
- 持有 nil 值的接口不是 nil
解释 1 和 2 的示例:
package main
import "fmt"
func main() {
var i1 interface{}
fmt.Println("a == nil: ", i1 == nil)
var i2 interface{}
var p *int = nil
i2 = p
fmt.Println("b == nil: ", i2 == nil)
}
输出:
a == nil: true
b == nil: false
它是如何在幕后工作的:
基本上,go 中的接口由两部分组成: adynamic type
和 a dynamic value
。当您将任何值分配给 nil *int 到接口时,现在它dynamic type
是*int
并且dynamic value
是 nil,因此接口现在是非 nil 并且与 nil 的任何比较都会导致错误
dynamic type
只有当它的和都是 nil 时,一个接口才等于dynamic value
nil。
在你的情况下:
在与 nil 进行比较之前,您需要提取接口 x 的动态值。
参考以下代码:
package main
import (
"fmt"
)
func Foo(x interface{}) {
fmt.Println("22, x == nil = ", (x).(*int) == nil)//22, x == nil = true
}
func main() {
var x *int = nil
fmt.Println("11, x == nil = ", x == nil)// 11, x == nil = true
Foo(x)
}
输出:
11, x == nil = true
22, x == nil = true
推荐阅读
- reactjs - 将 URL 绑定到状态呈现的组件
- javascript - 如何在 React Js 中设置匹配密码
- vue.js - Vuetify 自动完成不会渲染
- python - 如何在张量流中用 3d 张量对 2d 张量进行 matmul?
- c# - .Net Core - 从 API 中间件注入依赖 IUserInfo 到存储库层
- bison - 使用 flex 和 bizon 的基本 PHP 类解释器。减少/减少和转移/减少冲突
- python - Python3/Windows:模块“os”没有属性“mkfifo”
- windows - 当一个进程被 Windows 中的一个新进程覆盖时会发生什么
- javascript - Puppeteer 调用 onChange 事件处理程序不起作用
- excel - Powershell 脚本 - 将数据添加到 Excel