在go語言中,乙個類只要實現了介面要求的所有函式,我們就說這個類實現了該介面
inte***ce型別可以定義一組方法,用來表示乙個物件的行為特徵,inte***ce不能包含任何變數,介面是引用型別。
舉個簡單的例子,乙個動物的介面,動物有吃的能力,有叫的能力,等等,這裡省略,假如動物就只有吃和叫的能力。
package mainimport "fmt"type animal inte***ce
type dog struct
func (d *dog) eat()
func (d *dog) talk()
type cat struct
func (d *cat) eat()
func (d *cat) talk()
func main()
上面這個例子中,cat和dog實現了animal的所有方法,所以cat和dog都是動物
小結一下:
go中的介面不需要顯示的實現,只要乙個物件實現了介面型別中的所有方法,那麼這個物件就實現了這個介面,當然如果乙個物件實現了多個inte***ce型別的方法,那麼這個物件就實現了多個介面
//定義乙個支付的介面type pay inte***ce
//這裡定義乙個struct
type alipay struct
//這裡給alipay新增乙個支付方法,實現了pay介面中的pay方法
func (a *alipay) pay(userid int64,money float32) error
type wechatpay struct
//這裡也是實現了pay介面中的pay方法
func (w *wechatpay) pay(userid int64,money float32) error
//這裡定義乙個手機struct,並通過字典方式儲存自己開通的支付方式
type phone struct
func (p *phone) openwechatpay()
p.paymap["wechatpay"] =wechatpay
}func (p *phone) openalipay()
p.paymap["alipay"] =alipay
}func (p *phone) paymoney(name string,money float32)(err error)
err = pay.pay(1024,money)
return
}func main()
//這裡是用於開通自己有哪些支付方式
phone.openalipay()
err := phone.paymoney("wechatpay",100)
if err !=nil
}fmt.println("支付成功,歡迎再次光臨")
}
當然可以把上面中關於開通支付方式的兩個方法,用乙個通用的方法實現,如:
func (p *phone) openpay(name string,pay pay)
空介面沒有任何方法,所有的型別都實現了空介面,空介面什麼型別都可以存,如下例子:
package mainimport "fmt"func main()
var b
int = 10a =b
fmt.println(a)
var c string = "hello"a =c
fmt.println(a)
}
乙個介面可以巢狀在另外的介面裡面,同時乙個介面也可以巢狀多個介面
通過下面的例子來理解介面巢狀的概念
package mainimport "fmt"
//這裡定義乙個eater介面
type eater inte***ce
//這裡定義乙個talker介面
type talker inte***ce
//這裡定義個動物的介面,同時巢狀了eater和talker介面
type animal inte***ce
//這裡定義乙個dog的struct,並實現talk方法和eat方法,這樣就實現了動物的介面
type dog struct
func (d *dog) talk()
func (d *dog) eat()
func main()
var a animal
a =d
a.eat()
a.talk()
}
如果我們反向想要知道這個介面變數裡面實際儲存的是哪個型別的物件,可以用下面方法:
通過下面這個例子理解:
package mainimport (
"fmt")
type animal inte***ce
type dog struct
func (d *dog) eat()
func (d *dog) talk()
type cat struct
func (c *cat) eat()
func (c *cat) talk()
func justify(a animal)
dog.eat()
}func main()
var a animal
a =d
a.eat()
justify(a)
c := &cat{}
a =c
justify(a)
}
再寫乙個例子,用於判斷函式中傳入的引數的型別:
package mainimport (
"fmt")
//這裡通過...inte***ce{}表示傳入的是可變引數
func justify(items ...inte***ce{})
}}func main()
關於貓和狗**例子中justify方法還可以更改為:
func justify2(a animal)}
在最開始的時候寫了乙個關於理解介面的例子,如果我們現在想要判斷乙個變數是否實現了指定的支付的介面,可以通過如下**實現
wechat := &wechatpay{}//這裡需要乙個空介面
var tmp inte***ce{} =wechat
_,ok :=tmp.(pay)
ifok
Go語言基礎之介面
介面 inte ce 定義了乙個物件的行為規範,只定義規範不實現,由具體的物件來實現規範的細節。在go語言中介面 inte ce 是一種型別,一種抽象的型別。inte ce是一組method的集合,是duck type programming的一種體現。介面做的事情就像是定義乙個協議 規則 只要一台...
13Go語言基礎之介面
本文是李文周的部落格go語言學習之路的目錄提要版,方便複習檢視使用,原文參見文章連線 介面 inte ce 定義了乙個物件的行為規範,只定義規範不實現,由具體的物件來實現規範的細節。在go語言中介面 inte ce 是一種型別,一種抽象的型別。inte ce是一組method的集合,是duck ty...
GO基礎之陣列
一 陣列的宣告與遍歷 package main import fmt 宣告陣列的形式1 var arr 3 int var arr2 4 int func main fmt.println a b int 遍歷陣列方式1 for i 0 i fmt.println 遍歷陣列方式2 for value...