go 判定对象是否实现接口 进行 接口约束 (*interface{})(nil)
写法很牛逼,第一看把老子都看蒙了。
首先来理解
var a *int = (*int)(nil)
(*int)(nil) :意思是把 nil 类型 转换为 *int 类型
var a *int :声明一个 a 变量,类型为 *int
那么上面这个就不难理解吧
实现 接口约束
上面的场景一般没啥卵用,但如果把上面的 int 类型换成 接口类型,作用就多了。
譬如,我们下面这个例子:判定 某个对象是否实现了某个接口
package main import "fmt" // 定义一个借口 type inter1 interface { Hello() string } //定义2个类型 type StructA struct{} type StructB struct{} // structA 实现接口 func (s *StructA) Hello() string { return "" } func main() { // var sa inter1 = (*StructA)(nil) // fmt.Printf("%T", sa) // *main.StructA var sb inter1 = (*StructB)(nil) // 编译报错: *StructB does not implement inter1 (missing Hello method) fmt.Printf("%T", sb) }
接口约束语句
var _ logger2.Logger = (* Logger)(nil)
* _ : 表示不要这个值
* logger.Logger 为接口
* Logger 为实现这个接口的 类型
* nil: 表示把nil转为 Logger
如果 Logger 没有实现 logger2.Logger,那么会编译不通过
0顶
0 踩
共 0 条评论