我有一个我无法理解的小golang测试:
package main
import "fmt"
type myObj struct {
}
func nilObj() *myObj {
return nil
}
func nilInt() interface{} {
return nil
}
func main() {
var obj1 interface{}
fmt.Println(obj1 == nil) // true
obj1 = nilObj()
fmt.Println(obj1 == nil) // false
var obj2 *myObj
fmt.Println(obj2 == nil) // true
obj2 = nilObj()
fmt.Println(obj2 == nil) // true
var obj3 interface{}
fmt.Println(obj3 == nil) // true
obj3 = nilInt()
fmt.Println(obj3 == nil) // true
}
在obj1和obj2之间,只有变量声明发生变化,但结果却不同。
在obj1和obj3之间,函数调用不返回相同的类型(struct pointer vs interface)。我不完全确定我理解结果。
答案 0 :(得分:2)
在幕后,接口实现为两个元素,一个类型和一个值。该值称为接口的动态值,是一个任意的具体值,类型是值的类型。对于
int
值3,接口值示意性地包含(int, 3)
。仅当内部值和类型都未设置
nil
时,接口值才为(nil, nil)
。特别是,nil
接口始终保持nil
类型。如果我们在接口值中存储类型为nil
的{{1}}指针,则无论指针的值如何,内部类型都将为*int
:*int
。因此,即使内部指针是(*int, nil)
,这样的接口值也将是非nil
。