Go中nil类型及switch-case里nil返回值的正确处理方式
搞定你的Go代码nil匹配问题
嘿,我来帮你分析下为啥代码没输出预期的"5>2",主要是踩中了两个小坑:
1. 不存在types.Nil这个类型哦
你代码里写的case types.Nil:是错误的——Go里根本没有这个内置类型,这代码其实都编译不过。要匹配空接口返回的nil,直接写case nil:就对了。
2. 空接口的nil判断有讲究
当someFunc()直接return nil时,这个返回值是类型和值全为空的空接口,这时候类型switch里的case nil:才能匹配到。但如果是返回某个具体类型的nil(比如return (*int)(nil)),那类型switch会匹配对应的*int类型,而不是nil分支,这点要注意。
修正后的可运行代码
package main import "fmt" func someFunc() interface{} { if 5 > 2 { return nil } else if false { // 这里把something换成false,确保走第一个返回nil的分支 return 42 } return nil } func main() { switch v := someFunc().(type) { case int: fmt.Println("拿到整数啦:", v) case nil: fmt.Println("5>2") } }
额外小技巧
如果你需要区分“空接口本身就是nil”和“接口里存的是某个类型的nil值”,可以先单独判断接口是否为nil:
func main() { v := someFunc() if v == nil { fmt.Println("5>2") } else { switch v.(type) { case int: fmt.Println("Got an int") } } }
这样就能稳稳输出你想要的结果啦~
内容的提问来源于stack exchange,提问作者Kenenbek Arzymatov
相关产品推荐
相关产品推荐

