Go接口
2021-08-05 本文已影响0人
TZX_0710
接口
接口(interface)定义了一个对象的行为规范,只定义规范不是先,由具体的对象来实现规范的细节。在Go语言中接口是一种类型,一种抽象的类型。interface是一组method的集合,是duck-type programming的一种体现。
//接口的语法 type 接口类型名 interface{ 方法名1(参数列表1)返回值列表1 方法名2(参数列表2)返回值列表2 } //1.接口名:使用type将接口定义为自定义的类型名。Go语言的接口在命名时,一般会在单词后面添加er,如有写操作的接口叫Writer,有字符串功能的接口叫Stringer等。接口名最好要能突出该接口的类型含义。 //2.方法名:当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被接口所在的包(package)之外的代码访问。 //3.参数列表、返回值列表:参数列表和返回值列表中的参数变量名可以省略。 //值接收者和指针接收者实现接口的区别? //指针类型接受 package main import "fmt" //type Demo interface { // demo() //} //type demo struct{} // //func (d demo) demo() { // fmt.Println("demo实现") //} //func main() { // //使用值接收者实现接口之后,不管是demo结构体还是结构体指针*demo类型的变量都可以赋值给该接口变量。 // 因为demo指针 d2 内部会自动实现求 *demo // var d Demo // //值类型接受 // d = demo{} // d.demo() // //d2是指针类型 // d2 := &demo{} // d2.demo() //} //指针类型接受 type Demo interface { demo() move() } type demo struct{} func (d *demo) demo() { fmt.Println("demo实现") } func (d demo) move() { fmt.Println("测试") } func main() { //使用指针实现接口 只要接口当中的方法有指针接收者,那么采用值类型接口无法 接受 所以报错 var d Demo ////值类型接受报错 //d = demo{} //d.demo() //d2是指针类型 d = &demo{} d.demo() }
类型与接口的关系
一个类型实现多个接口
一个类型可以同时实现多个接口,而接口之间彼此独立,不知道对方的实现。
// Sayer 接口 type Sayer interface { say() } // Mover 接口 type Mover interface { move() }
多个类型实现同一个接口
Go语言中不同类型还可以实现同一个接口。一个接口得方法不一定由一个类型完全实现。
type Demo interface { demo() } type demo struct{} type demo1 struct {} func (d *demo) demo() { fmt.Println("demo实现") } func (d *demo1) demo() { fmt.Println("测试") }
接口嵌套
接口与接口之间可以通过嵌套创造出新的接口
type Demo interface { run1() } type Demo1 interface { run2() } type Common interface { Demo Demo1 }
空接口
空接口是指没有定义任何方法的接口。因此任何类型都实现了空接口。
空接口类型的变量可以存储任意类型的变量
var x interface{} x=1 x=true