Go interface
Posted followyou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go interface相关的知识,希望对你有一定的参考价值。
接口(interface)
Go中使用组合实现对象特性的描述。对象的内部使用结构体内嵌组合对象具有的特性,对外通过接口暴露能使用的特性。
Go的接口设计是非侵入式的,接口实现者不需要关系接口会被怎样使用,调用者也不需要关心接口的实现细节。接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式、类型及结构。
非侵入式设计是Go语言设计师经过多年的大项目经验总结出来的设计之道。只有让接口和实现者真正解耦,编译速度才能真正提高,项目之间的耦合度也会降低不少
接口声明
type 接口类型名 interface{
方法名1(参数列表1) 返回值列表1
方法名2(参数列表2) 返回值列表2
...
}
实现接口
package main
import (
"database/sql"
"fmt"
)
// 定义一个数据写入器
type DataWriter interface {
WriteData(data interface{}) error
}
// 定义文件结构,用于实现Data Write
type file struct {
Dsn string
conn *sql.DB
}
// 实现DataWriter方法
func (d *file) WriteData(data interface{}) error{
// 模拟数据写入
fmt.Println("Write Data:",data)
return nil
}
func main(){
//实例化file
f := new(file)
// 声明一个DataWriter的接口
var writer DataWriter
// 接口赋值file,也就是*file类型
writer = f
// 使用DataWriter接口进行数据写入
writer.WriteData("data")
}
函数名不一致导致报错
试图修改file结构的WriteData()方法名
cannot use f (type *file) as type DataWriter in assignment:
*file does not implement DataWriter (missing WriteData method)
实现接口的方法签名不一致导致的报错
func (d *file) WriteData(data int) error
cannot use f (type *file) as type DataWriter in assignment:
*file does not implement DataWriter (wrong type for WriteData method)
have WriteData(int) error
want WriteData(interface {}) error
类型和接口关系
类型与接口之间有一对多和多对一关系。
一个类型可以实现多个接口
一个类型可以同时实现多个接口,而接口间彼此独立,不知道对方的实现。
网络上的两个程序通过一个双向的通信连接实现数据的交换,连接的一端称为一个Socket。Socket能够同时读取和写入数据,这个特性与文件类似。因此,开发中把文件和Socket都具备的读写特性抽象为独立的读写器概念。
Socket和文件一样,在使用完毕后,也需要对资源进行释放
type Socket struct {
}
func (s *Socket) Write(p []byte) (n int, err error) {
return 0,nil
}
func (s *Socket) Close() error {
return nil
}
Socket结构的Write()方法实现了io.Writer接口:
type Write interface {
Write(p []byte) (n int, err error)
}
同时,Socket结构也实现了io.Closer接口
type Closer interface {
Close() error
}
使用Socket实现的Writer接口的代码,无须了解Writer接口的实现者是否具备Closer接口的特性。同样,使用Closer接口的代码也并不知道Socket已经实现了Writer接口
多个类型实现相同的接口
以上是关于Go interface的主要内容,如果未能解决你的问题,请参考以下文章
[Go] 利用类型断言把interface{}的转换回原类型
Go语言无锁队列组件的实现 (chan/interface/select)
[Go] gocron源码阅读-空接口类型interface{}
[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础
解决go: go.mod file not found in current directory or any parent directory; see ‘go help modules‘(代码片段