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

原创做者,公众号【程序员读书】,欢迎关注公众号,转载文章请注明出处哦。程序员

如同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.Fileos.File实现了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())
}

复制代码

你的关注,是我写做路上最大的鼓励!

相关文章
相关标签/搜索