原創做者,公衆號【程序員讀書】,歡迎關注公衆號,轉載文章請註明出處哦。程序員
如同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())
}
複製代碼
你的關注,是我寫做路上最大的鼓勵!