Golang返回nil

3

我正在努力学习Golang的类型和接口,但是有些困难。无论如何,我经常看到的一种模式是func Whatever() (thing string, err error)。 我理解所有这些内容,但是唯一困惑的是为什么可以return "thing", nil。我正在查看的具体实例在revel中 -

func (c *GorpController) Begin() revel.Result {
    txn, err := Dbm.Begin()
    if err != nil {
        panic(err)
    }
    c.Txn = txn
    return nil
}

revel.Result 是一个具有以下签名的接口 -

type Result interface {
    Apply(req *Request, resp *Response)
}

无论如何,我只是好奇返回nil如何满足编译器在那种情况下的要求。有没有资源可以指向我看看?

1个回答

12
这类似于返回一个空错误: 参见"为什么我的空错误值不等于空?"。
在底层,接口被实现为两个元素:类型和值。该值称为接口的动态值,是任意具体值,其类型是该值的类型。对于整数值3,接口值包含(int,3)。只有当内部值和类型都未设置(nil,nil)时,接口值才为nil。特别地,nil接口将始终保存nil类型。如果我们将类型为*int的指针存储在接口值中,则内部类型将是*int,而不管指针的值如何:(*int,nil)。因此,即使内部指针为空,这种接口值也将是非nil的。这里,nil是接口revel.Result的零值。

2
非常完美的解释。非常感谢您。Go是我学过的同时最容易和最困难的语言之一。 - Brandon Hansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接