go 接口
特殊的数据类型 方法定义的合集 方法名(形参类型)返回值类型 提高代码的复用率 package main import "fmt" // Animal 定义一个animal的接口,它有唱,
go 接口
发布时间:2023-10-06 (2023-10-06)

特殊的数据类型

方法定义的合集

方法名(形参类型)返回值类型

提高代码的复用率

package main

import "fmt"

// Animal 定义一个animal的接口,它有唱,跳,rap的方法
type Animal interface {
  sing()
  jump()
  rap()
}

// Chicken 需要全部实现这些接口
type Chicken struct {
  Name string
}

func (c Chicken) sing() {
  fmt.Println("chicken 唱")
}

func (c Chicken) jump() {
  fmt.Println("chicken 跳")
}
func (c Chicken) rap() {
  fmt.Println("chicken rap")
}

// 全部实现完之后,chicken就不再是一只普通的鸡了

func main() {
  var animal Animal

  animal = Chicken{"ik"}

  animal.sing()
  animal.jump()
  animal.rap()

}

接口本身不能绑定方法

接口是值类型,保存的是:值+原始类型

package main

import "fmt"

// Animal 定义一个animal的接口,它有唱,跳,rap的方法
type Animal interface {
  sing()
  jump()
  rap()
}

// Chicken 需要全部实现这些接口
type Chicken struct {
  Name string
}

func (c Chicken) sing() {
  fmt.Println("chicken 唱")
}

func (c Chicken) jump() {
  fmt.Println("chicken 跳")
}
func (c Chicken) rap() {
  fmt.Println("chicken rap")
}

// Cat 需要全部实现这些接口
type Cat struct {
  Name string
}

func (c Cat) sing() {
  fmt.Println("cat 唱")
}

func (c Cat) jump() {
  fmt.Println("cat 跳")
}
func (c Cat) rap() {
  fmt.Println("cat rap")
}

func sing(obj Animal) {
  obj.sing()
}

// 全部实现完之后,chicken就不再是一只普通的鸡了

func main() {
  chicken := Chicken{"ik"}
  cat := Cat{"阿狸"}
  sing(chicken)
  sing(cat)
}

实现接口:

一个类型实现了接口的所有方法

即实现了该接口

类型断言

还原为原始类型 interface.(Type)

如果接口没有保存类型,则会报错

可返回两个值

value,ok := interface.(Type)

空接口

interface{}

空接口可以保存任何类型

package main

import "fmt"

type data interface{}

type Dog struct {
  Name string
}

func Print(d data) {
  fmt.Println(d)
}

func main() {
  d := Dog{"小黑"}

  Print(d)

  Print(12)
  Print("123")
  Print(true)
  Print([]int{1, 2, 3})
  Print(make(map[string]string, 2))
}

nil问题

nil值:有类型没有值,接口本身并不是nil,可以处理

nil接口:既没有报错值,也没有保存类型,使用时会报错