如同Java
,PHP
等面向对象的编程语言的接口一样,Go也内置有接口类型,为面向对象提供有力支持,但与其他编程语言还是有很多不一样的地方,下面来学习一下。
接口的定义
什么是接口?
Go提供了丰富的数据类型,如整型、浮点型等基础类型和struct
,slice
,array
,map
,channel
,func
等复合或引用类型,我们称这些类型为具体的类型,对于这些具体类型,我们可以知道类型里面的值是什么或这些类型可以做什么操作。
接口是则是一种抽象类型,接口只是一系列方法的集合,抽象实现某些功能需要的方法,但接口不提供具体的实现,而是操供一种规范,这种规范为具有相同行为,但却有不同实现的行为提供一套规则。
所以,我们不应该关心某个接口到底是什么,只是应该关心某接口能做什么。
接口的声明
怎么样声明一个接口?
在Go语言中使用关键字interface
声明一个接口,格式如下:
type name interface {//name表示接口的名称
}
复制代码
下面示例是Go语言标准库io
包的最常用的接口:io.Writer
,这个接口提供了写入bytes的抽象方法。
package io
type Writer interface {
Write(p []byte) (n int, err error)
}
复制代码
我们最常用使用的fmt包中有几个重要的格式化输出方法都以该接口为参数,以Fprint()为例:
func Fprint(w io.Writer, a ...interface{}) (n int, err error)
复制代码
这意味着Fprint()函数的第一个参数,可以是实现io.Writer的任意类型。
Fprint(os.Stdout,"输出一段字符串控制台")//输出到控制台
var buf bytes.Buffer
Fprint(&buf,"输出一段字符串到缓存区")
fmt.Println(buf.string())//输出
复制代码
在上面的例子中,os.Stdout
的类型是*os.File
,os.Fil
e实现了io.Writer
中的write()
方法,bytes.Buffer
也是同样的。
如何实现一个接口
定义一个接口后,如何实现呢?
在Go语言中,实现一个接口,并不需要像其他语言一样,使用implement关键字实现该接口,Go语言支持隐式实现一个接口。
当我们在某个具体的类型中定义了接口的所有方法时,则该类型自动实现了该接口,下面我们自定义一个struct
结构体,并实现io.Writer
接口。
type MyWriter struct{
str []byte
}
func (my *MyWriter)Write(p []byte) (n int, err error) {
my.str = p
return len(my.str), nil
}
func (my MyWriter)Str()string{
return string(my.str)
}
func main() {
m := &MyWriter{}
fmt.Fprint(m,"test")
fmt.Println(m.Str())
}
复制代码