Go - interface
在go語言中,也有接口的定義。但是和其他語言不同的是,go語言的接口比較“特殊”。。。
?
定義
接口是一個或者多個方法簽名的集合,它之后方法的定義,沒有方法的實現,也不能在其中定義字段。
// interface.go package mainimport ("fmt" )type IUSB interface {GetName() stringConnect() }func main() {fmt.Println("Hello World!") }?
實現接口
在go語言中,通過定義類型來實現接口。實現接口的時候,無需顯示指定實現了那個接口(這與其他語言不同),只需要定義出所需實現接口的所有方法即可。我們成這種方式為(Structural typing).
// interface.go package mainimport ("fmt" )type IUSB interface {GetName() stringConnect() }type CellPhoneUSB struct {Name string }func (cp CellPhoneUSB) GetName() string {return cp.Name }func (cp CellPhoneUSB) Connect() {fmt.Println("cell phone connected...", cp.Name) }func main() {var a IUSBa = CellPhoneUSB{"myCellPhone"}a.Connect() }我們先看下輸出結果:
?
可以看到,我們定義了一個類型是CellPhoneUSB,它實現了IUSB中的兩個方法GetName()和Connect().?
在main函數里面,我們定義了一個變量a,它的類型是接口IUSB,然后我們將a轉換成為一個type(CellPhoneUSB),在此之后,我們調用了類型CellPhoneUSB的connect方法。
?
?
接口嵌套
當我們需要將明確接口的層次結構的時候,就需要使用接口的嵌套。例如
type Connector interface {Connect() }type IUSB interface {GetName() stringConnector }?
類型判斷
有時候,由于我們實現的類型是實現了某種嵌套的接口,這時就需要我們進行類型判斷。 閑話少說,上code
// interface.go package mainimport ("fmt" )type Connector interface {Connect() }type IUSB interface {GetName() stringConnector }type CellPhoneUSB struct {Name string }func (cp CellPhoneUSB) GetName() string {return cp.Name }func (cp CellPhoneUSB) Connect() {fmt.Println("cell phone connected...", cp.Name) }func Disconnect(connector Connector) {if pc, ok := connector.(CellPhoneUSB); ok {fmt.Println("disconnected ...", pc.Name)}fmt.Println("type unknown!") }func main() {var a IUSBa = CellPhoneUSB{"myCellPhone"}a.Connect()Disconnect(a) }我們定義了一個Disconnect的方法,在其中需要判斷是否為指定的類型(CellPhoneUSB), 這里使用了表達式語句?
if pc, ok := connector.(CellPhoneUSB); ok {...
}
:= 的右邊是 -> 類型實例.(期望類型)
?
空接口與type-switch
go語言允許我們使用空接口來模擬類似object類型的類型。此時,判斷類型實現了那個接口就稍顯復雜。不過我們可以用type-swtich語句來處理。
func GetType(obj interface{}) {switch result := obj.(type) {case CellPhoneUSB:fmt.Println("It is a cell phone usb", result.Name)default:fmt.Println("Unknown type...")} }?
?
使用接口的規則
1. 調用接口傳入對象時,無論怎樣定義,都是對象的 copy, 因此,無法改變原對象。
2.?只有當接口存儲的類型和對象都為nil時,接口才等于nil。
?
轉載于:https://www.cnblogs.com/atuotuo/p/7048778.html
總結
以上是生活随笔為你收集整理的Go - interface的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】【C++】__stdcall、__
- 下一篇: java webproject中logb