关于Go语言的接口值
GO语言的接口值
Go语言中,一个接口的值有两个部分:具体类型和该类型的一个值。e二者称为动态类型和动态值
接口类型的零值
在Go中,变量总是初始化为一个特定的值,接口的零值就是它的动态类型和值都设置为nil
var w io.Writer
fmt.Println(reflect.TypeOf(w), w)
这段代码运行结果为
PS D:\chengxu\test\go> go build .\main.go | .\main.exe
<nil> <nil>
如果把一个具体类型赋给一个接口类型,那这个接口类型变量变为具体类型,值也变为具体类型的值
var w io.Writer
fmt.Println(reflect.TypeOf(w), w)
w = os.Stdout
fmt.Println(reflect.TypeOf(w), w)
运行结果为
PS D:\chengxu\test\go> go build .\main.go | .\main.exe
<nil> <nil>
*os.File &{0xc0000d0280}
如果一个接口被重新被赋值nil,那么他的动态类型和动态值重新都变为nil。
var w io.Writer
fmt.Println(reflect.TypeOf(w), w)
w = os.Stdout
fmt.Println(reflect.TypeOf(w), w)
w = nil
fmt.Println(reflect.TypeOf(w), w)
结果为
PS D:\chengxu\test\go> go build .\main.go | .\main.exe
<nil> <nil>
*os.File &{0xc00010e280}
<nil> <nil>
含有空指针的非空接口
有一种特殊情况,接口值得类型不为nil,而他的动态值为nil
func main() {
var buf *bytes.Buffer
f(buf)
}
func f(out io.Writer) {
if out != nil {
out.Write([]byte("done\n"))
}
}
在这种情况下,类型为*bytes.Buffer的空指针被赋给了out参数,所以out的动态值为nil,动态类型为 *bytes.Buffer,而在检查 **out != nil ** 中,它会通过,因为只有当一个接口类型值得两个部分都为nil时,它 == nil的结果才会使false。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具