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())
}

複製代碼

你的關注,是我寫做路上最大的鼓勵!

相關文章
相關標籤/搜索