要一直走下去

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

接口是一种类型

(实现多态的特性),规定了其他类型的方法,接口既然是一种类型,那可以做为参数和返回值
接口的保存分为两部分:动态类型动态值

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\n", a, a)
}

 

// 空接口作为map值,实现value可以保存任意类型的字典。
var studentInfo = make( map[string]interface{} )
studentInfo["name"] = "你好"
studentInfo["age"] = 18
studentInfo["married"] = false
fmt.Println(studentInfo)

 

posted on 2020-07-02 19:00  要一直走下去  阅读(82)  评论(0编辑  收藏  举报