Go语言学习路

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
上一篇下一篇

猜你喜欢

热点阅读