读书笔记之Go接口

Go语言接口

Go语言中的接口是非侵入式的:让接口与实现者真正解耦!

  1. 实现者只实现目标方法,而无需指明是哪个接口的方法!
  2. 接口更无需知道哪些类型实现了接口!
  3. 接口中只有方法声明,或嵌套的接口,不能有其他类型结构,常量等!

接口声明

类似,接口和结构体一样,都是一种类型:(type关键字)

type 接口类型名 interface{
	方法名1(参数列表1) 返回值列表1
	方法名2(参数列表2) 返回值列表2
	......
}

注意点:

  1. 接口类型名常以er结尾,比如:Writer
  2. 接口名、方法名首字母大写才能被其他包访问;
  3. 参数列表 和 返回值列表 的参数名都可以省略!

实现接口

条件:

  1. 接口方法与实现的方法格式必须一致
  2. 实现结构体必须实现接口中所有方法
	type Writer interface {
		Write(v interface{}) error
	}
	
	type File struct {
	}
	
	func (f *File) Write(v interface{}) error{
		.....
	}

使用结构体实现的接口方法

  1. 实现结构体直接使用
	file := new(File)
	
	file.Write(Data)
  1. 多态特性: 只是接口名和结构体指针之间是多态情况!
	func main() {
		f := new(File)
		get(f) //"file"
	
		i := new(Io)
		get(i) //"IO"
	
	}
	
	func get(w Writer) {
		w.Write("")
	}
	
	type Writer interface {
		Write(v interface{})
	}
	
	type File struct {}
	
	func (f *File) Write(v interface{}) {
		fmt.Println("file")
	}
	
	type Io struct {}
	
	func (i *Io) Write(v interface{})  {
		fmt.Println("IO")
	}

接口也可以嵌套

接口之间也可以继承:

type Writer interface {
}

type Closer interface {
}

type WriterCloser interface {
	Writer
	Closer
}

接口与类型间转换

一、断言语句

t,ok := i.(T)【双向的:可以指针转接口,也可以接口转指针!】

  • 如果ok是true那么,t 就是 i 转化后的T类型;否则,i 是T类型的默认值!

二、switch分支类型断言:

switch 接口变量.(type) {
    case类型1:
      // 变量是类型1时的处理
    case类型2:
      // 变量是类型2时的处理default:
	 // 变量不是所有case中列举的类型时的处理
}

三、reflect.TypeOf(T)

反射获取变量类型!

空接口类型(interfac{})

所有类型都实现的接口,可以保存所有值的类型,相当于Java中的Object,但比Object范围更广,它把基本类型、指针等任何类型都包括!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值