下面列出几种类型的nil的定义

var myErr *MyError // nil
var ch chan int // nil
var myFunc func() // nil
var i interface{} // nil
var m map[int]string // nil
var slice []string // nil

接口类型nil的使用

var iface interface{} // nil
fmt.Println(iface==nil) // true

iface=myErr
fmt.Println(myErr) // nil
fmt.Println(iface==nil) // false

  iface等于nil,但将myErr赋值给iface后iface就不等于nil了,同时打印出iface的值又是nil,怎么nil !=nil呢?
  接口底层其实由类似于type和data两部分组成,当type和data同时为nil时接口才等于nil,当把myErr赋值给iface时,iface的type为*MyError,data为nil,type和data不同时为nil,所以iface不等于nil。