给出以下代码:
package main
import (
"fmt"
)
type work interface {
filter() bool
}
type organ struct {
name string
}
func (s *organ) filter () bool {
return true;
}
func main() {
kidney := &organ {
name : "kidney",
}
_, ok := interface{}(kidney).(work)
fmt.Println(ok);
}
Run Code Online (Sandbox Code Playgroud)
我没有完全得到以下部分:
_, ok := interface{}(kidney).(work)
Run Code Online (Sandbox Code Playgroud)
在我看来,它是将结构转换为interface{}类型,我理解,但为什么需要转换为interface{}类型来检查它是否满足另一个接口.更具体地说,为什么以下代码失败?
ok := kidney.(work)
Run Code Online (Sandbox Code Playgroud)
有错误
invalid type assertion: kidney.(work) (non-interface type *organ on left)
TL; DR如果您总是知道具体类型(例如kidney),那么您不需要类型断言; 只需将其传递给您的work变量并继续 - 编译器将保证kidney满足work接口,否则您的程序将无法编译.
您必须首先将具体类型转换为a interface{}的原因是因为类型断言(即动态类型检查)仅在动态类型(即接口)之间有意义.对编译器在编译时可以保证的事情进行运行时类型检查是没有意义的.希望这有道理吗?