Go语言基础——接口| 青训营

63 阅读2分钟

接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的)。接口里也不能包含变量。

定义接口

可以通过如下格式定义接口

type WorkInter interface{
    // 一些函数的定义,不做具体的实现,只定义函数
    Work()
}

只包含一个方法的接口名字由方法名加(e)r组成。Go 语言中的接口都很简短,通常它们会包含 0 个、最多 3 个方法。

类型(比如结构体)实现接口方法集中的方法,每一个方法的实现说明了此方法是如何作用于该类型的:即实现接口,同时方法集也构成了该类型的接口。实现了 Namer 接口类型的变量可以赋值给 ai (接收者值),此时方法表中的指针会指向被实现的接口方法。

类型不需要显式声明它实现了某个接口:接口被隐式地实现。多个类型可以实现同一个接口。

实现某个接口的类型(除了实现接口方法外)可以有其他的方法。

一个类型可以实现多个接口。

接口类型可以包含一个实例的引用, 该实例的类型实现了此接口(接口是动态类型)。

空接口

var a interface{}

空接口就相当于一种承受能力很强的类型,能够接收所有复杂类型。

接口断言

其他类型可以转换为接口类型,而接口类型同样可以转换为其他类型。

可以用以下方法来创造接口断言

value := in.(type)
value, ok := in.(type)

如果类型断言失败,okfalse,反之为true

接口与动态类型

Go没有类。Go 中的接口跟 Java类似:都是必须提供一个指定方法集的实现。

Go 是唯一结合了接口值,静态类型检查(是否该类型实现了某个接口),运行时动态转换的语言,并且不需要显式地声明类型是否满足某个接口。该特性允许我们在不改变已有的代码的情况下定义和使用新接口。

接收一个(或多个)接口类型作为参数的函数,其实参可以是任何实现了该接口的类型。 实现了某个接口的类型可以被传给任何以此接口为参数的函数。

显式地指明类型实现了某个接口

可以向接口的方法集中添加一个具有描述性名字的方法。

type Fooer interface { Foo() ImplementsFooer() }

空接口和函数重载

Go 语言中函数重载可以用可变参数 ...T 作为函数最后一个参数来实现。