原创做者,公众号【程序员读书】,欢迎关注公众号,转载文章请注明出处哦。程序员
如同Java
,PHP
等面向对象的编程语言的接口同样,Go也内置有接口类型,为面向对象提供有力支持,但与其余编程语言仍是有不少不同的地方,下面来学习一下。编程
什么是接口?缓存
Go提供了丰富的数据类型,如整型、浮点型等基础类型和struct
,slice
,array
,map
,channel
,func
等复合或引用类型,咱们称这些类型为具体的类型,对于这些具体类型,咱们能够知道类型里面的值是什么或这些类型能够作什么操做。bash
接口是则是一种抽象类型,接口只是一系列方法的集合,抽象实现某些功能须要的方法,但接口不提供具体的实现,而是操供一种规范,这种规范为具备相同行为,但却有不一样实现的行为提供一套规则。编程语言
因此,咱们不该该关心某个接口究竟是什么,只是应该关心某接口能作什么。函数
怎么样声明一个接口?学习
在Go语言中使用关键字interface
声明一个接口,格式以下:ui
type name interface {//name表示接口的名称
}
复制代码
下面示例是Go语言标准库io
包的最经常使用的接口:io.Writer
,这个接口提供了写入bytes的抽象方法。spa
package io
type Writer interface {
Write(p []byte) (n int, err error)
}
复制代码
咱们最经常使用使用的fmt包中有几个重要的格式化输出方法都以该接口为参数,以Fprint()为例:code
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())
}
复制代码
你的关注,是我写做路上最大的鼓励!