将接口转换为其他接口


以一
以一 2023-12-31 03:03:11 64534
分类专栏: 资讯

将接口转换为其他接口

实现某个接口的类型同时实现了另外一个接口,此时可以在两个接口间转换。

鸟和猪具有不同的特性,鸟可以飞,猪不能飞,但两种动物都可以行走。如果使用结构体实现鸟和猪,让它们具备自己特性的 Fly() 和 Walk() 方法就让鸟和猪各自实现了飞行动物接口(Flyer)和行走动物接口(Walker)。

将鸟和猪的实例创建后,被保存到 interface{} 类型的 map 中。interface{} 类型表示空接口,意思就是这种接口可以保存为任意类型。对保存有鸟或猪的实例的 interface{} 变量进行断言操作,如果断言对象是断言指定的类型,则返回转换为断言对象类型的接口;如果不是指定的断言类型时,断言的第二个参数将返回 false。例如下面的代码:

  1. var obj interface = new(bird)
  2. f, isFlyer := obj.(Flyer)

代码中,new(bird) 产生 *bird 类型的 bird 实例,这个实例被保存在 interface{} 类型的 obj 变量中。使用 obj.(Flyer) 类型断言,将 obj 转换为 Flyer 接口。f 为转换成功时的 Flyer 接口类型,isFlyer 表示是否转换成功,类型就是 bool。

下面是详细的代码(代码1):

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. // 定义飞行动物接口
  6. type Flyer interface {
  7. Fly()
  8. }
  9.  
  10. // 定义行走动物接口
  11. type Walker interface {
  12. Walk()
  13. }
  14.  
  15. // 定义鸟类
  16. type bird struct {
  17. }
  18.  
  19. // 实现飞行动物接口
  20. func (b *bird) Fly() {
  21. fmt.Println("bird: fly")
  22. }
  23.  
  24. // 为鸟添加Walk()方法, 实现行走动物接口
  25. func (b *bird) Walk() {
  26. fmt.Println("bird: walk")
  27. }
  28.  
  29. // 定义猪
  30. type pig struct {
  31. }
  32.  
  33. // 为猪添加Walk()方法, 实现行走动物接口
  34. func (p *pig) Walk() {
  35. fmt.Println("pig: walk")
  36. }
  37.  
  38. func main() {
  39.  
  40. // 创建动物的名字到实例的映射
  41. animals := map[string]interface{}{
  42. "bird": new(bird),
  43. "pig": new(pig),
  44. }
  45.  
  46. // 遍历映射
  47. for name, obj := range animals {
  48.  
  49. // 判断对象是否为飞行动物
  50. f, isFlyer := obj.(Flyer)
  51. // 判断对象是否为行走动物
  52. w, isWalker := obj.(Walker)
  53.  
  54. fmt.Printf("name: %s isFlyer: %v isWalker: %v\n", name, isFlyer, isWalker)
  55.  
  56. // 如果是飞行动物则调用飞行动物接口
  57. if isFlyer {
  58. f.Fly()
  59. }
  60.  
  61. // 如果是行走动物则调用行走动物接口
  62. if isWalker {
  63. w.Walk()
  64. }
  65. }
  66. }

代码说明如下:

  • 第 6 行定义了飞行动物的接口。
  • 第 11 行定义了行走动物的接口。
  • 第 16 和 30 行分别定义了鸟和猪两个对象,并分别实现了飞行动物和行走动物接口。
  • 第 41 行是一个 map,映射对象名字和对象实例,实例是鸟和猪。
  • 第 47 行开始遍历 map,obj 为 interface{} 接口类型。
  • 第 50 行中,使用类型断言获得 f,类型为 Flyer 及 isFlyer 的断言成功的判定。
  • 第 52 行中,使用类型断言获得 w,类型为 Walker 及 isWalker 的断言成功的判定。
  • 第 57 和 62 行,根据飞行动物和行走动物两者是否断言成功,调用其接口。


代码输出如下:

name: pig isFlyer: false isWalker: true
pig: walk
name: bird isFlyer: true isWalker: true
bird: fly
bird: walk

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=33162
赞同 0
评论 0 条
以一L0
粉丝 0 发表 893 + 关注 私信
上周热门
银河麒麟添加网络打印机时,出现“client-error-not-possible”错误提示  1519
银河麒麟打印带有图像的文档时出错  1438
银河麒麟添加打印机时,出现“server-error-internal-error”  1230
统信操作系统各版本介绍  1149
统信桌面专业版【如何查询系统安装时间】  1145
统信桌面专业版【全盘安装UOS系统】介绍  1103
麒麟系统也能完整体验微信啦!  1056
统信【启动盘制作工具】使用介绍  709
统信桌面专业版【一个U盘做多个系统启动盘】的方法  652
信刻全自动档案蓝光光盘检测一体机  556
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
如何玩转信创开放社区—从小白进阶到专家 15
信创开放社区邀请他人注册的具体步骤如下 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

添加我为好友,拉您入交流群!

请使用微信扫一扫!