接口是一种类型
(实现多态的特性),规定了其他类型的方法,接口既然是一种类型,那可以做为参数和返回值
接口的保存分为两部分:动态类型和动态值
type 接口类型名 interface{
方法名1( 参数列表1 ) 返回值列表1
方法名2( 参数列表2 ) 返回值列表2
…
}
接口没有指针接口这一说,只有实现接口的结构体有指针方法或实例方法
只要实现了接口中所有的方法,都是该接口类型,“实现”是指,方法名和参数和返回值类型都一样。
例子:定义一个接口
type Runner interface {
Run(int, int) (string, string)
...
}
值接收者 vs 指针接收者实现接口
值接收者实现接口:可以把值或者指针赋给接口类型变量 writer 为接口 a1为实现了接口的
func (a MyWriter)Run{...} // MyWriter是实现Writer接口的结构体
需要 var b Writer = a1(...)
或 var b Writer = &a1(...)
指针接收者实现接口: 只能把指针赋给接口类型变量 a1为接口
func (a *MyWriter)Run{...} // MyWriter是实现Writer接口的结构体
只能var b Writer = &a1(...)
多个类型可以实现同一个接口
略
一个类型可以实现多个接口
略
接口嵌套
// Sayer 接口
type Sayer interface {
say()
}// Mover 接口
type Mover interface {
move()
}// 接口嵌套
type animal interface {
Sayer
Mover
}
空接口
type xx interface{}
任何类型都实现了这个接口,任何类型变量都可以赋值给它,没有必要起名字,通常定义成
interface {}
// 空接口作为函数参数,可以接收任意类型的函数参数
func show(a interface{}) {
fmt.Printf("type:%T value:%v ", a, a)
}
// 空接口作为map值,实现value可以保存任意类型的字典。
var studentInfo = make( map[string]interface{} )
studentInfo["name"] = "你好"
studentInfo["age"] = 18
studentInfo["married"] = false
fmt.Println(studentInfo)