上代码
type Person struct {
Name string
}
func GetPerson() *Person {
var p *Person
return p
}
func GetPerson1() interface{} {
var p *Person
return p
}
func main() {
p := GetPerson()
fmt.Println(p == nil) // true
p1 := GetPerson1()
fmt.Println(p1 == nil) // false
p2, ok := p1.(*Person)
fmt.Println(p2 == nil, ok) // true, true
}
代码分析
在go中,任何变量都有值和类型两个内容,==
是比较值和内容的,只有2者都相等了才会相等。
第一个是true,p是*Person类型,是可以和nil比较的,任何指针类型都可以和nil比较
第二个是false,因为p1的类型是interface{}*Persion,虽然值是nil,但是不等于nil,类型没有匹配上
第三个是2个true,p2的类型是*Person,值是nil,同p,和nil是相等的。
坑
这个地方要注意,经常有类似于GetPerson1() interface{}
写法,即函数的返回值是interface{}类型,这个时候就要注意每一个return的地方都只能返回nil,不能反正某个结构体的指针。当函数过长的时候容易发生这个问题。