Go The Way 之 接口断言 和 接口组合

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() {}

/**
接口查询测试: 断言。
 */
func fun3() {
	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)
func fun4()  {
	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() {}

//测试接口组合
func fun5() {
	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 关系是可以成立的,所以可以类型断言成功。
  • 相反如果a.© 代表 c = a,而c中有a 没有方法C(),当调用C方法时,a是没有相应实现的。所以 c = a 赋值关系时不可行。所以断言失败。
  • 接口A 和接口B 拥有这相同的函数,所以AReal和BReal 同时实现了接口A和接口B。所以AReal 和 BReal 关系密切(等同),可以相互赋值。具体可查看Go 接口赋值
func4() 分析
  • interface{} 空接口可以存储任意类型的数据
  • a.(type) 可以获取对象a 属于哪个类型或哪些接口
  • func4 中 a 不管是AReal、BReal或者CReal 都会输出A,因为这些对象实现了A接口,又因为自动break 所以只打印A
func5() 分析
  • 因为接口CC 继承了接口A ,又加了属于自己的方法C,这样它的接口方法声明和接口C相同。所以CCReal 类型既实现了接口CC也实现了接口C 。CReal类既实现了接口CC也实现了接口C。CReal 和CCReal对象可以相互赋值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值