Golang学习笔记(十二):接口的声明与使用

https://juejin.im/post/5c8b90606fb9a049e93d9ece

如同Java,PHP等面向对象的编程语言的接口一样,Go也内置有接口类型,为面向对象提供有力支持,但与其他编程语言还是有很多不一样的地方,下面来学习一下。

接口的定义

什么是接口?

Go提供了丰富的数据类型,如整型、浮点型等基础类型和struct,slice,array,map,channel,func等复合或引用类型,我们称这些类型为具体的类型,对于这些具体类型,我们可以知道类型里面的值是什么或这些类型可以做什么操作。

接口是则是一种抽象类型,接口只是一系列方法的集合,抽象实现某些功能需要的方法,但接口不提供具体的实现,而是操供一种规范,这种规范为具有相同行为,但却有不同实现的行为提供一套规则。

所以,我们不应该关心某个接口到底是什么,只是应该关心某接口能做什么。

接口的声明

怎么样声明一个接口?

在Go语言中使用关键字interface声明一个接口,格式如下:

  1. type name interface {//name表示接口的名称
  2. }

下面示例是Go语言标准库io包的最常用的接口:io.Writer,这个接口提供了写入bytes的抽象方法。

  1. package io
  2. type Writer interface {
  3. Write(p []byte) (n int, err error)
  4. }

我们最常用使用的fmt包中有几个重要的格式化输出方法都以该接口为参数,以Fprint()为例:

  1. func Fprint(w io.Writer, a ...interface{}) (n int, err error)

这意味着Fprint()函数的第一个参数,可以是实现io.Writer的任意类型。

  1. Fprint(os.Stdout,"输出一段字符串控制台")//输出到控制台
  2. var buf bytes.Buffer
  3. Fprint(&buf,"输出一段字符串到缓存区")
  4. fmt.Println(buf.string())//输出

在上面的例子中,os.Stdout的类型是*os.Fileos.File实现了io.Writer中的write()方法,bytes.Buffer也是同样的。

如何实现一个接口

定义一个接口后,如何实现呢?

在Go语言中,实现一个接口,并不需要像其他语言一样,使用implement关键字实现该接口,Go语言支持隐式实现一个接口。

当我们在某个具体的类型中定义了接口的所有方法时,则该类型自动实现了该接口,下面我们自定义一个struct结构体,并实现io.Writer接口。

  1. type MyWriter struct{
  2. str []byte
  3. }
  4. func (my *MyWriter)Write(p []byte) (n int, err error) {
  5. my.str = p
  6. return len(my.str), nil
  7. }
  8. func (my MyWriter)Str()string{
  9. return string(my.str)
  10. }
  11. func main() {
  12. m := &MyWriter{}
  13. fmt.Fprint(m,"test")
  14. fmt.Println(m.Str())
  15. }
ft_authoradmin  ft_create_time2019-08-03 17:07
 ft_update_time2019-08-03 17:07