我试图围绕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
如何满足编译器。有没有我可以指出的资源?
答案 0 :(得分:9)
这类似于返回零错误:请参阅" Why is my nil error value not equal to nil? "
在幕后,接口实现为两个元素,一个类型和一个值。
该值称为接口的动态值,是一个任意的具体值,类型是值的类型。对于
int
值3
,接口值示意性地包含(int, 3
)。仅当内部值和类型都未设置(
nil
)时,接口值才为nil, nil
。特别是,nil
界面将始终保持nil
类型 如果我们在接口值中存储类型为*int
的指针,则无论指针的值如何,内部类型都将为*int
。(*int, nil
)。
因此,即使内部指针为non-nil
,这样的接口值也将为nil
。
此处nil
是接口revel.Result
的零值。