關(guān)鍵字interface
- 如果一個結(jié)構(gòu)體綁定的方法包含接口的所有方法,即認(rèn)為實現(xiàn)了該接口
- 將對象賦值給接口時,會發(fā)生拷貝,而接口的存儲是指向這個復(fù)制的指針,復(fù)制的無法修改原來狀態(tài),也無法獲取指針
type CallBack interface{
getName() string
}
type User struct{
name string
}
func (user User) getName()string{
return user.name
}
user:=User{}
f.println(user.getName())
- 上面聲明了一個CallBack,結(jié)構(gòu)體User綁定了一個getName的方法,跟CallBack接口所聲明的接口名稱一樣,而且實現(xiàn)了CallBack接口的所有方法(他現(xiàn)在只聲明了一個接口方法),所以結(jié)構(gòu)體User實現(xiàn)了CallBack接口
- 接口可以跟接口嵌套,有點類似結(jié)構(gòu)體嵌套一樣
type CallBack interface{
getName() string
BaseCall
}
type BaseCall interface{
doSomething()
}
func (user User) doSomething(){
f.println("something to do")
}
func (user User) getName()string{
return user.name
}
user:=User{}
user.doSomething()
f.println(user.getName())
- 根據(jù)接口獲取實現(xiàn)的結(jié)構(gòu)體的對象,進(jìn)行一些操作
//強(qiáng)制轉(zhuǎn)換,判斷User結(jié)構(gòu)體是否實現(xiàn)了CallBack接口
func hasInterface(callback CallBack){
if u,ok:=callback.(User);ok{
f.Println("name is:",u.name)
return
}
f.Println("not has interface")
}
- 在golang中,所以結(jié)構(gòu)體都實現(xiàn)了一個空的接口,所以,上面可以改造一個伸縮性比較好的判斷,符合哪個,t自動強(qiáng)轉(zhuǎn)該類型
func hasInterface(intf interface{}){
switch t:=intf.(type){
case User:
f.println("struct is:",t.name)
default:
f.println("unknow")
}
}
- 接口之間可以強(qiáng)轉(zhuǎn),但是只能上轉(zhuǎn)下,就是外部的接口可以強(qiáng)轉(zhuǎn)嵌套內(nèi)的接口,但是嵌套內(nèi)的接口不能強(qiáng)轉(zhuǎn)外部的接口,有點像繼承子類強(qiáng)轉(zhuǎn)父類,但是父類不能強(qiáng)轉(zhuǎn)子類一樣
callBack := User{Info: Info{name: "key le "}}
var base BaseCall
base=BaseCall(callBack)
base.doSomething()
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者