上篇:GO——學習筆記(七)
下篇:GO——學習筆記(九)
參考:
https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.6.md
示例代碼——go_7
https://github.com/jiutianbian/golang-learning/blob/master/go_7/main.go
interface
interface基本定義
各個編程語言關(guān)于接口的定義:接口相當于是一份契約煌集,它規(guī)定了一個對象所能提供的一組操作夯尽。
golang中的interface也是此作用:interface是就是一組method簽名的組合,我們可以通過interface來定義對象的一組行為困食。在golang中,假如一個對象實現(xiàn)了interface中的所有method饮亏,那么我們就說此對象實現(xiàn)了此interface温眉,通過interface我們可以讓面向?qū)ο蠛蛢?nèi)容組織實現(xiàn)非常的方便苫费。
上面說了這么多概念,我們來看下办铡,具體的interface的聲明辞做,實現(xiàn),以及作用
interface的聲明與對象實現(xiàn)interface
例如現(xiàn)在定義了一個interface叫做function寡具,它其中有兩個method秤茅,run()和stop(),那么現(xiàn)在再定義兩個不同的對象,car和bike童叠,他們都實現(xiàn)了run()和stop()方法框喳,我們就說car和bike實現(xiàn)了這個叫做function的interface,代碼如下
//聲明一個叫function的接口
type function interface {
run()
stop()
}
//申明三個對象 car 和 bike厦坛,hunman
type car struct {
brand string
price string
speed string
size string
}
type bike struct {
brand string
price string
speed string
}
type human struct {
name string
age string
}
//car 和 bike 都實現(xiàn)了run和stop方法五垮,我們就說car和bike實現(xiàn)了function這個interface,而 human 沒有實現(xiàn)run方法杜秸,就沒有實現(xiàn)function這個interface
func (c car) run() {
fmt.Println("我是汽車:", c.brand, c.price, c.speed, "我跑起來了")
}
func (c car) stop() {
fmt.Println("我是汽車:", c.brand, c.price, c.speed, "我停下來了")
}
func (b bike) run() {
fmt.Println("我是自行車:", b.brand, b.price, b.speed, "我跑起來了")
}
func (b bike) stop() {
fmt.Println("我是自行車:", b.brand, b.price, b.speed, "我停下來了")
}
func (h human) stop() {
fmt.Println("我是:", h.name, h.age, "我停下來了")
}
interface使用
簡單使用
如果定義個interface變量拼余,那這個變量就能夠持實現(xiàn)了這個interface的任意類型的對象。
我們通過代碼來了解亩歹,上面定義了的function這個interface匙监,和3個對象car,bike小作,human亭姥,其中car,bike實現(xiàn)了function這個interface顾稀,而human沒有达罗,我們現(xiàn)在定義一個類型為function的fc變量,fc可以持有實現(xiàn)了function這個interface方法的對象car和bike的變量,benchi和fenghaung粮揉,不能持有human變量yaoming巡李,如果持有會報錯
func main() {
//定義一個類型為function的變量fc
var fc function
var benchi car
var fenghaung bike
// var yaoming human
benchi = car{"奔馳", "60萬", "140km/h", "很大"}
fenghaung = bike{"鳳凰", "1k", "20km/h"}
// yaoming = human{"姚明", "40"}
//fc能夠持有實現(xiàn)了function這個interface方法的對象car和bike的變量,benchi和fenghaung扶认,不能持有human侨拦,如果持有會報錯
fc = benchi
fc.run()
fc.stop()
fc = fenghaung
fc.run()
fc.stop()
// fc = yaoming
// yaoming.stop()
}
空interface
如果我們定義了一個空的interface,由于interface里面不包含任何的method辐宾,所以任意類型都實現(xiàn)了此interface狱从,所以空的interface就能夠持有任意類型的變量值,代碼如下
type nullInterface interface{}
func testNullInterface() {
var jiaobaba nullInterface
var age int
var name string
var yaoming human
name = "易建聯(lián)"
age = 15
yaoming = human{"姚明", "40"}
//jiaobaba這個空的interface變量能夠持有任意類型
jiaobaba = name
fmt.Println(jiaobaba)
jiaobaba = age
fmt.Println(jiaobaba)
jiaobaba = yaoming
fmt.Println(jiaobaba)
}
interface函數(shù)參數(shù)
既然interface變量能夠持有實現(xiàn)了此interface方法的的變量叠纹,那么我就可以定義函數(shù)參數(shù)為interface來接受不同類型的參數(shù)季研,代碼如下:
// function這個interface作為參數(shù),可以接受實現(xiàn)了他的對象car和bike的變量
func showYourFunction(fc function) {
fc.run()
fc.stop()
}
func testParamInterface() {
benchi := car{"奔馳", "60萬", "140km/h", "很大"}
fenghaung := bike{"鳳凰", "1k", "20km/h"}
showYourFunction(benchi)
showYourFunction(fenghaung)
}
如何判斷interface變量存儲的具體類型
Go語言里面有一個語法誉察,Comma-ok斷言与涡,可以直接判斷是否是該類型的變量: value, ok = element.(T),這里value就是變量的值持偏,ok是一個bool類型递沪,element是interface變量,T是斷言的類型综液,代碼如下
type nullInterface interface{}
func showInterfaceType(nl nullInterface) {
value, ok := nl.(int)
fmt.Println("value:", value, "ok", ok)
//打印 value: 0 ok: false value: 1 ok: true
}
func testCommaInterface() {
showInterfaceType("1")
showInterfaceType(1)
}