本文目錄一覽:
golang 新人求助:關於接口的應用
go裏面接口不是顯示的實現的;
如果你給一個接口變量賦一個實現過此接口方法的對象時,都可以被認為這個對象實現了這個接口,並可以使用。
java怎麼調用golang的接口
1 接口的定義與理解
接口是一個自定義類型,它是一組方法的集合。從定義上來看,接口有兩個特點。第一,接口本質是一種自定義類型,因此不要將golang中的接口簡單理解為C++/Java中的接口,後者僅用於聲明方法簽名。第二,接口是一種特殊的自定義類型,其中沒有數據成員,只有方法(也可以為空)。
接口是完全抽象的,因此不能將其實例化。然而,可以創建一個其類型為接口的變量,它可以被賦值為任何滿足該接口類型的實際類型的值。接口的重要特性是:
(1)只要某個類型實現了接口要的方法,那麼我們就說該類型實現了此接口。該類型的值可以賦給該接口的值;
(2)作為1的推論,任何類型的值都可以賦值給空接口interface{}
注意:這只是golang中接口的特性,為非所有類型的特性(接口是一種特殊的類型)。
接口的特性是golang支持鴨子類型的基礎,即「如果它走起來像鴨子,叫起來像鴨子(實現了接口要的方法),它就是一隻鴨子(可以被賦值給接口的值)」。憑藉接口機制和鴨子類型,golang提供了一種有利於類、繼承、模板之外的更加靈活強大的選擇。
2 例子
type Exchanger interface {
exchange()
}
type StringPair struct {
first, second string
}
type Point[2]int
func (sp *StringPair) exchange() {
sp.first, sp.second = sp.second, sp.first
}
func (p *Point) exchange() {
p[0], p[1] = p[1], p[0]
}
func exchangeThese(exchangers …Exchanger) {
for _, exchanger := range exchangers {
exchanger.exchange()
}
}
func main() {
pair1 := StringPair{“abc”,”def”}
pair2 := StringPair{“ghi”,”jkl”}
point := Point{5, 7}
fmt.Println(pair1, pair2, point)
pair1.exchange()
pair2.exchange()
point.exchange()
fmt.Println(pair1, pair2, point)
// exchangeThese(pair1, pair2) //wrong
exchangeThese(pair1, pair2)
fmt.Println(pair1, pair2)
}
運行結果
在本例中,自定義類型StringPair和Point指針實現了接口Exchanger所需的方法,因此該類型的值可以被賦值給接口的值。
另外,特別注意一點。如果使用exchangeThese(pair1,
pair2)會導致編譯錯誤(如下圖),正確寫法應當是exchangeThese(pair1,
pair2)。這是由於真正滿足接口Exchanger的類型是StringPair指針,而非StringPair。
在golang中,值接收者和指針接收者的方法集是不同的。只是golang會智能地解引用和取引用,使得二者的方法集看上去是一樣的。但是,在調用exchangeThese時,就凸顯出二者的不同了。
Golang入門到項目實戰 | golang接口
接口像是一個公司裏面的領導,他會定義一些通用規範,只設計規範,而不實現規範。
go語言的接口,是一種新的類型定義,它把所有的具有共性的方法定義在一起,任何其他類型只要實現了這些方法就是實現了這個接口。
語法格式和方法非常類似。
在接口定義中定義,若干個空方法。這些方法都具有通用性。
下面我定義一個USB接口,有讀read和寫write兩個方法,再定義一個電腦Computer和一個手機Mobile來實現這個接口。
USB接口
Computer結構體
Mobile結構體
Computer實現USB接口方法
Mobile實現USB接口方法
測試
運行結果
下面我們定義一個OpenClose接口,裏面有兩個方法open和close,定義個Door結構體,實現其中一個方法。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/255066.html