006 GO-高级数据类型(接口)
6.1 接口定义
在Go语言中,一个接口类型总是代表着某一种类型(即所有实现它的类型)的行为。一个接口类型的声明通常会包含关键字type、类型名称、关键字interface以及由花括号包裹的若干方法声明。示例如下:
type Animal interface { Grow() Move(string) string }
- 代表中某一种类型(即所有实现它的类型)的行为。
- 接口类型中的方法声明式 普通方法的简化形式,它们只包括方法名称、参数声明列表和结果声明列表。
- 其中的参数的名称和结果的名称都可以被省略。不过,出于文档化的目的,我还是建议大家在这里写上它们。因此,Move方 法的声明至少应该是这样的:
Move(new string) (old string)
6.2 接口实现
- 方法集合为其超集”的条件
- 在Go语言中,这种判定可以用类型断言来实现。——判断是否是接口的实现(不能直接判断,必须要转换为空接口类型的值)
- 不能在一个非接口类型的值上应用类型断言来判定它是否属于某一个接口类型的。我们必须先把前者转换成空接口类型的值。这又涉及到了Go语言的类型转换。
这是典型的 【无侵入式的接口实现方法】
- 空接口 一方面,所谓空接口类型即是不包含任何方法声明的接口类型,用interface{}表示,常简称为空接口
- Go语言中的包含预定义的任何数据类型都可以被看做是空接口的实现:
类型转换表达式:
我们可以直接使用类型转换表达式把一个*Person类型转换成空接口类型的值,就像这样:
p := Person{"Robert", "Male", 33, "Beijing"} v := interface{}(&p)
注意,表达式&p(&是取址操作符)的求值结果是一个*Person类型的值,即p的指针。
6.3 接口关系判断
类型断言:
h, ok := v.(Animal)
6.4 接口示例
// go_interface project main.go
package main
import (
"fmt"
)
type Animal interface {
Grow()
Move(string) string
}
type Cat struct {
name string
age int
address string
}
func (catAni *Cat) Grow() {
}
func (catAni *Cat) Move(gowhere string) (fromwhere string) {
fromwhere = catAni.address
catAni.address = gowhere
return fromwhere
}
func main() {
myCat := Cat{"Little C", 2, "In the house"}
nl_animal, ok := interface{}(&myCat).(Animal)
fmt.Printf("%v,%v\n", ok, nl_animal)
//fmt.Println("Hello World!")
}
|