接口

接口(interface)定义了一个对象的行为规范,只定义规范不是先,由具体的对象来实现规范的细节。在Go语言中接口是一种类型,一种抽象的类型。interface是一组method的集合,是duck-type programming的一种体现。

```go //接口的语法 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() }

  1. <a name="6b3b41ad"></a>
  2. #### 类型与接口的关系
  3. > > <a name="39e27231"></a>
  4. ##### 一个类型实现多个接口
  5. > 一个类型可以同时实现多个接口,而接口之间彼此独立,不知道对方的实现。
  6. > ```go
  7. // Sayer 接口
  8. type Sayer interface {
  9. say()
  10. }
  11. // Mover 接口
  12. type Mover interface {
  13. move()
  14. }

多个类型实现同一个接口

Go语言中不同类型还可以实现同一个接口。一个接口得方法不一定由一个类型完全实现。

```go type Demo interface { demo() } type demo struct{} type demo1 struct {}

func (d demo) demo() { fmt.Println(“demo实现”) } func (d demo1) demo() { fmt.Println(“测试”) }

  1. > > <a name="0ffd5901"></a>
  2. ##### 接口嵌套
  3. > 接口与接口之间可以通过嵌套创造出新的接口
  4. > ```go
  5. type Demo interface {
  6. run1()
  7. }
  8. type Demo1 interface {
  9. run2()
  10. }
  11. type Common interface {
  12. Demo
  13. Demo1
  14. }

空接口

空接口是指没有定义任何方法的接口。因此任何类型都实现了空接口。

空接口类型的变量可以存储任意类型的变量

  1. var x interface{}
  2. x=1
  3. x=true