Golang回归零

时间:2014-11-11 21:50:42

标签: go revel

我试图围绕Golang的类型和接口,但我正在努力做到这一点。无论如何,我看到的常见模式是func Whatever() (thing string, err error)。我知道所有这些是如何工作的,但我感到困惑的一件事是为什么return "thing", nil可以。我正在看的具体实例是在这里狂欢 -

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 个答案:

答案 0 :(得分:9)

这类似于返回零错误:请参阅" Why is my nil error value not equal to nil? "

  

在幕后,接口实现为两个元素,一个类型和一个值

     

该值称为接口的动态值,是一个任意的具体值,类型是值的类型。对于int3,接口值示意性地包含(int, 3)。

     

仅当内部值和类型都未设置(nil)时,接口值才为nil, nil。特别是,nil界面将始终保持nil类型   如果我们在接口值中存储类型为*int的指针,则无论指针的值如何,内部类型都将为*int。(*int, nil)。
  因此,即使内部指针为non-nil,这样的接口值也将为nil

此处nil是接口revel.Result的零值。