package main
import (
"fmt"
"reflect"
)
type People interface {
Show()
}
type Student struct{}
func (stu *Student) Show() {}
func live() People {
var stu *Student
return stu
}
func main() {
i := live()
fmt.Println(reflect.TypeOf(i))
fmt.Println(i)
if i == nil {
fmt.Println("A")
} else {
fmt.Println("B")
}
}
为什么nil不等于nil
因为在底层,interface作为两个成员来实现,一个类型和一个值,type用于存储变量的动态类型,data用于存储变量的具体数据,只有(nil,nil)是才是真正的nil
在上面代码中值为nil,但是类型不为nil,所有与nil不相等,输出B
package main
import (
"fmt"
"reflect"
)
type People interface {
Show()
}
type Student struct{}
func (stu *Student) Show() {}
func live() People {
//var stu *Student
return nil
}
func main() {
i := live()
fmt.Println(reflect.TypeOf(i))
fmt.Println(i)
if i == nil {
fmt.Println("A")
} else {
fmt.Println("B")
}
}
在上面的代码中,可以看出当类型和值都为nil时,是与nil相等的,输出A
package main
import (
"fmt"
"reflect"
)
type People interface {
Show()
}
type Student struct{}
func (stu *Student) Show() {}
func live() *Student {
var stu *Student
return stu
}
func main() {
i := live()
fmt.Println(reflect.TypeOf(i))
fmt.Println(i)
if i == nil {
fmt.Println("A")
} else {
fmt.Println("B")
}
}
将live()函数的返回值改为*Student后,与nil相比较是相等的,输出A
可以得知,只有接口类型底层是保存类型和值得,其他只保存值,比较时也只比较值是不是nil