Go interface的类型问题

pabno · · 667 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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>
}
  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.
}

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:pabno

查看原文:Go interface的类型问题

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

667 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传