💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
Go中两个Nil可能不相等。 接口(interface) 是对非接口值(例如指针,struct等)的封装,内部实现包含 2 个字段,类型 T 和 值 V。一个接口等于 nil,当且仅当 T 和 V 处于 unset 状态(T=nil,V is unset)。 两个接口值比较时,会先比较 T,再比较 V。 接口值与非接口值比较时,会先将非接口值尝试转换为接口值,再比较。 ~~~go func main() { var p *int = nil var i interface{} = p fmt.Println(i == p) // true fmt.Println(p == nil) // true fmt.Println(i == nil) // false } ~~~ 这个例子中,将一个nil非接口值p赋值给接口i,此时,i的内部字段为(T=\*int, V=nil),i与p作比较时,将 p 转换为接口后再比较,因此`i == p`,p 与 nil 比较,直接比较值,所以`p == nil`。 但是当 i 与nil比较时,会将nil转换为接口(T=nil, V=nil),与i(T=\*int, V=nil)不相等,因此`i != nil`。因此 V 为 nil ,但 T 不为 nil 的接口不等于 nil。