這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
關鍵字interface
- 如果一個結構體綁定的方法包含介面的所有方法,即認為實現了該介面
- 將對象賦值給介面時,會發生拷貝,而介面的儲存是指向這個複製的指標,複製的無法修改原來狀態,也無法擷取指標
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,結構體User綁定了一個getName的方法,跟CallBack介面所聲明的介面名稱一樣,而且實現了CallBack介面的所有方法(他現在只聲明了一個介面方法),所以結構體User實現了CallBack介面
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())
//強制轉換,判斷User結構體是否實現了CallBack介面func hasInterface(callback CallBack){ if u,ok:=callback.(User);ok{ f.Println("name is:",u.name) return } f.Println("not has interface")}
- 在golang中,所以結構體都實現了一個空的介面,所以,上面可以改造一個伸縮性比較好的判斷,符合哪個,t自動強轉該類型
func hasInterface(intf interface{}){ switch t:=intf.(type){ case User: f.println("struct is:",t.name) default: f.println("unknow") }}
- 介面之間可以強轉,但是只能上轉下,就是外部的介面可以強轉嵌套內的介面,但是嵌套內的介面不能強轉外部的介面,有點像繼承子類強轉父類,但是父類不能強轉子類一樣
callBack := User{Info: Info{name: "key le "}}var base BaseCallbase=BaseCall(callBack)base.doSomething()