package main
import"fmt"type A interface{A()B()}type AReal struct{}func(*AReal)A(){}func(*AReal)B(){}type B interface{A()B()}type BReal struct{}func(*BReal)A(){}func(*BReal)B(){}type C interface{A()B()C()}type CReal struct{}func(*CReal)A(){}func(*CReal)B(){}func(*CReal)C(){}/**
接口查询测试: 断言。
*/funcfun3(){var a A =new(AReal)var b B =new(BReal)var c C =new(CReal)if_, ok := a.(B); ok {// 检查 a 这个对象实例是否实现了B 的接口
fmt.Println(ok)}else{
fmt.Println("NO")}if_, ok := b.(A); ok {// 检查 b 这个对象实例是否实现了A 的接口
fmt.Println(ok)}else{
fmt.Println("NO")}if_, ok := a.(C); ok {// 检查 a 这个对象实例是否实现了C 的接口
fmt.Println(ok)}else{
fmt.Println("NO")}if_, ok := c.(A); ok {// 检查 c 这个对象实例是否实现了A 的接口
fmt.Println(ok)}else{
fmt.Println("NO")}if_, ok := c.(C); ok {// 检查 c 这个对象实例是否实现了C 的接口
fmt.Println(ok)}else{
fmt.Println("NO")}/**
以上的结果是:
true
true
NO
true
true
*/}// 类型查询(断言2)funcfun4(){var a interface{}=new(AReal)switch a.(type){case A:
fmt.Println("A")case B:
fmt.Println("B")case C:
fmt.Println("C")}}// 接口组合: 类似匿名组合,接口也可以进行组合 实现 1 + 1 = 2 的效果type CC interface{
A
C()// 这样这个接口就有了 A() , B() C()}type CCReal struct{}func(*CCReal)A(){}func(*CCReal)B(){}func(*CCReal)C(){}//测试接口组合funcfun5(){var c C =new(CReal)var cc CC =new(CCReal)
c = cc
cc = c
}
fun3() 分析
c.(A) 即为一个类型断言,表示对象c,它的类型为CReal,它是否实现了接口A。由于c 对应的CReal类型实现了C接口,C接口定义了方法A、B、C 而接口A定义方法A、B;断言c.(A) => a = c,由于a中所有的方法,c中都有,所以 a = c 关系是可以成立的,所以可以类型断言成功。