Golang中interface的基本用法详解
什么是interface
interface 是一组需要实现的方法的列表。类似于其他语言中的抽象类,interface 是 Golang 中实现多态的机制之一。具有相同行为特征的实现方法就可以可以实现相同的 interface,相同的 interface 可被相互替换使用。interface 可以理解为是一种规范,接口是一种能力。
在 Golang 中,interface 是一个接口类型,通常定义如下:
type InterfaceName interface {
MethodName1(args) ReturnType
MethodName2(args) ReturnType
// ...
}
interface 由 InterfaceName + 方法列表组成。其中,InterfaceName 是 interface 的名称,它是一个 Go 类型。方法列表是 interface 包含的方法,方法名+参数列表+返回值都被包含在内。
interface 的基本使用
声明 interface 类型变量
在 Golang 中,interface 类型变量可以存储具有相同方法的任何类型的值。比如:
type Animal interface {
Say() string
}
type Cat struct{}
func (c Cat) Say() string {
return "猫:喵喵喵"
}
type Dog struct{}
func (d Dog) Say() string {
return "狗:汪汪汪"
}
func main() {
var a Animal
c := Cat{}
d := Dog{}
a = c
fmt.Println(a.Say()) // 猫:喵喵喵
a = d
fmt.Println(a.Say()) // 狗:汪汪汪
}
上述代码中,Animal 是一个 interface。它包含一个 Say() 方法。Cat 和 Dog 类型都实现了 Say() 方法,因此它们可以被赋值给 Animal 类型的变量。在 main 函数中,定义了变量 a,它的类型为 Animal。首先把 Cat 的实例赋值给 a,然后执行 a.Say() 输出“猫:喵喵喵”,接着又将 Dog 的实例赋值给 a,执行 a.Say() 输出“狗:汪汪汪”。
判断变量是否实现了某个 interface
在 Golang 中,可以使用 type assertion 和 comma-ok 来判断变量是否实现了某个 interface。
type Animal interface {
Say() string
}
type Cat struct{}
func (c Cat) Say() string {
return "猫:喵喵喵"
}
func main() {
var a interface{} = Cat{}
animal, ok := a.(Animal)
if ok {
fmt.Println(animal.Say()) // 猫:喵喵喵
} else {
fmt.Println("转换失败!")
}
}
上述代码中,首先定义了一个 Cat 类的实例 a,然后通过 a.(Animal) 进行类型转换,如果类型转换成功,则表示变量 a 是 Animal 类型。这个方式有一个问题,就是必须明确地知道变量 a 的类型。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Golang中interface的基本用法详解 - Python技术站