Go interface的类型问题

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) //, 
    fmt.Printf("%T %v\n", b, b) //*utils.Animal 

    a = b
    fmt.Printf("%T, %v\n", a, a) //*utils.Animal, 

    a = nil
    fmt.Printf("%T, %v\n", a, a) //, 
}
  1. 使用interface声明的变量,初始类型是nil
  2. 使用interface实现类声明的指针变量,初始类型是实现类的指针类型
  3. 当将实现类指针nil变量赋值给接口变量时,接口变量的类型就改变了

对于官网中提到的这段代码, 就是因为返回的是实现类指针nil变量,所以返回的是一个non-nil变量

func returnsError() error {
    var p *MyError = nil
    if bad() {
        p = ErrBad
    }
    return p // Will always return a non-nil error.
}

你可能感兴趣的