Go的面向对象(2)| 豆包MarsCode AI 刷题

104 阅读2分钟

多态

golang的多态是通过接口实现的

接口体现多态特征

  • 多态参数
  • 多态数组

接口

是golang面向对象的核心

说明

  • interface不能包含任何变量
  • golang中的接口不需要显示的实现,只要一个变量实现了接口类型中的所有方法,就意味着实现了这个接口
  • 接口里的所有方法都没有方法体,体现了程序设计的多态和高内聚低耦合思想

细节

  • interface不能创建实例,可以指向一个实现了该接口的实例(和Java一样)
  • 只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型
  • 一个自定义类型可以实现多个接口(对golang来说根本不关心实现了哪个接口,只关心方法)
  • 一个接口A可以继承多个别的接口(B,C),这时如果要实现A接口,也必须将b,c接口方法全部实现
  • interface类型默认是一个指针,接口是引用类型,如果没有对接口初始化就使用,那么输出nil
  • interface{}空接口没有任何方法,所以所有类型都实现了空接口(常用于函数形参)我们可以把任何一个变量赋给空接口

类型断言

Go语言中使用接口断言(type assertions)将接口转换成另外一个接口,也可以将接口转换为另外的类型。接口的转换在开发中非常常见,使用也非常频繁。

格式

t = i.(T) // 表示判断i是否指向T类型的变量,如果是就转成T类型并赋值给t变量,否则panic
t,ok = i.(T)  // 直接panic不是很友好,这里如果不是那么ok为false,t为T类型的零值

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

类型分支

type-switch 流程控制的语法被看作是类型断言的增强版,和switch-case 流程控制代码块有些相似

switch 接口变量.(type) {  // 这里也可以用一个变量接受,switch t := 接口变量.(type) 
    case 类型1:
        // 变量是类型1时的处理
    case 类型2:
        // 变量是类型2时的处理default:
        // 变量不是所有case中列举的类型时的处理
}

同样的,如果传入一个空接口类型参数,type-switch也可以用于判断传入的参数具体实现了哪个接口

error接口

查看Go语言的源码就会发现 error 类型是一个非常简单的接口类型

// The error built-in interface type is the conventional interface for
// representing an error condition, with the nil value representing no error.
type error interface {
    Error() string
}

除了之前介绍过的使用errors.New来自定义错误外,我们还可以通过实现error接口,自定义error