一 nil判断
nil在Go语言中只能被赋值给指针和接口。接口在底层的实现有两个部分,type 和 data:
- 显式地将nil赋值给接口时:
接口 == nil
,此时接口的type和data都为nil。 - 将带类型的nil赋给接口:
接口 != nil
package main
import "fmt"
type Student struct {
}
func (m *Student) String() string {
return "hi"
}
// 在函数中返回 fmt.Stringer接口
func GetStringer() fmt.Stringer {
var s *Student = nil
return s
}
func main() {
if GetStringer() == nil {
fmt.Println("GetStringer() == nil")
} else {
fmt.Println("GetStringer() != nil")
}
}
上述案例输出了 !=nil
,为了避免这个误判的问题,可以这样修改:
func GetStringer() fmt.Stringer {
var s *Student = nil
if s == nil {
return nil
}
return s
}