Why is my nil error value not equal to nil?
这篇官方文章中提到了interface中的type和value问题,当一个接口变量的type和value都为nil时,变量==nil
的判断才为true
那么interface中的type是怎么确定的呢?
看完这段代码就能明白了
package utils
type Animal struct {
}
type Behavior interface {
fly()
}
func (ani *Animal) fly() {
fmt.Println("animal fly")
}
func TestNil(test *testing.T) {
var a Behavior
var b *Animal
fmt.Printf("%T, %v\n", a, a) //<nil>, <nil>
fmt.Printf("%T %v\n", b, b) //*utils.Animal <nil>
a = b
fmt.Printf("%T, %v\n", a, a) //*utils.Animal, <nil>
a = nil
fmt.Printf("%T, %v\n", a, a) //<nil>, <nil>
}
- 使用interface声明的变量,初始类型是nil
- 使用interface实现类声明的指针变量,初始类型是实现类的指针类型
- 当将实现类指针nil变量赋值给接口变量时,接口变量的类型就改变了
对于官网中提到的这段代码, 就是因为返回的是实现类指针nil变量,所以返回的是一个non-nil变量
func returnsError() error {
var p *MyError = nil
if bad() {
p = ErrBad
}
return p // Will always return a non-nil error.
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。