golang 什么是接口?
創(chuàng)新互聯(lián)建站是一家專業(yè)提供馬尾企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、網(wǎng)站制作、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為馬尾眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。如果說goroutine和channel是Go并發(fā)的兩大基石,那么接口是Go語言編程中數(shù)據(jù)類型的關(guān)鍵。在Go語言的實(shí)際編程中,幾乎所有的數(shù)據(jù)結(jié)構(gòu)都圍繞接口展開,接口是Go語言中所有數(shù)據(jù)結(jié)構(gòu)的核心。
相關(guān)推薦:golang教程
golang中的接口
1. 接口
概念:接口定義了一組方法,但是不包含這些方法的具體實(shí)現(xiàn);它們是抽象的,接口不能包含變量。
接口的定義格式
type Namer interface { method1() return_type method2() return_type }
2. 一個(gè)接口的栗子
package main import "fmt" type Message interface { Send() } type user struct { name string score int } func (u *user) Send() { fmt.Println("hi", u.name, "this is your ", u.score) } func sendMessage(msg Message) { msg.Send() } func main() { u := &user{name: "roty", score: 44} sendMessage(&u) }
Golang 中的 interface 讓編碼更靈活、易擴(kuò)展,使得 Go 擁有了面向?qū)ο蠖鄳B(tài)的特性。
在此我們記住三點(diǎn)就夠了:
● 方法聲明的集合
● 任何類型的對象實(shí)現(xiàn)了在接口中聲明的全部方法,則表明該類型實(shí)現(xiàn)了對應(yīng)接口。
● 可以作為一種數(shù)據(jù)類型,實(shí)現(xiàn)了該接口的任何對象都可以給對應(yīng)的接口類型變量賦值。
結(jié)合例子去理解上述三點(diǎn):
package main import "fmt" import "math" // 幾何圖形的接口(interface) type geometry interface { area() float64 perim() float64 } // rect 和 circle 實(shí)現(xiàn) geometry 接口 type rect struct { width, height float64 } type circle struct { radius float64 } // 實(shí)現(xiàn)了接口中聲明的所有方法即實(shí)現(xiàn)了該接口,這里 rects 實(shí)現(xiàn)了 geometry 接口 func (r rect) area() float64 { return r.width * r.height } func (r rect) perim() float64 { return 2*r.width + 2*r.height } // circles 實(shí)現(xiàn) geometry 接口 func (c circle) area() float64 { return math.Pi * c.radius * c.radius } func (c circle) perim() float64 { return 2 * math.Pi * c.radius } // 定義的接口可以作為一種數(shù)據(jù)類型,當(dāng)一個(gè)變量的類型為一個(gè)接口類型時(shí),這個(gè)變量可以調(diào)用接口中定義的方法。 // 這里定義一個(gè)函數(shù),接收一個(gè)類型為 geometry 的參數(shù)變量 func measure(g geometry) { fmt.Println(g) fmt.Println(g.area()) fmt.Println(g.perim()) } func main() { r := rect{width: 3, height: 4} c := circle{radius: 5} // The circle and rect struct types both implement the geometry interface so we can use instances of these structs as arguments to measure. // rect 和 circle 結(jié)構(gòu)類型都實(shí)現(xiàn)了 geometry 接口,所以我們能夠把它們的對象作為參數(shù)傳給 measure 函數(shù) // 在 measure 函數(shù)內(nèi)部,參數(shù)對象調(diào)用了所屬類型實(shí)現(xiàn)的接口方法。 measure(r) measure(c) }
一種類型只要實(shí)現(xiàn)接口聲明的方法就算實(shí)現(xiàn)了接口,同樣一種類型能同時(shí)支持實(shí)現(xiàn)多個(gè)接口了,一個(gè)接口也能被多種類型實(shí)現(xiàn)。如果一種類型實(shí)現(xiàn)了某個(gè)接口,那么這種類型的對象能夠賦值給這個(gè)接口類型的變量。
package main import "fmt" type I interface { method1() } type T struct{} func (T) method1() {} func main() { var i I = T{} fmt.Println(i) }
最后的一部分解釋一下 interface{} 類型,這種類型的接口沒有聲明任何一個(gè)方法,俗稱空接口。因?yàn)槿魏晤愋偷膶ο蠖寄J(rèn)實(shí)現(xiàn)了空接口(上文提到任意類型只要實(shí)現(xiàn)了接口的方法就算實(shí)現(xiàn)了對應(yīng)的接口,由于空接口沒有方法,故所有類型默認(rèn)都實(shí)現(xiàn)了空接口)在需要任意類型變量的場景下非常有用。
package main import ( "fmt" ) func PrintAll(vals []interface{}) { for _, val := range vals { fmt.Println(val) } } func main() { names := []string{"stanley", "david", "oscar"} vals := make([]interface{}, len(names)) for i, v := range names { vals[i] = v } PrintAll(vals) } // stanley // david // oscar
以上就是golang中什么是接口的詳細(xì)內(nèi)容,更多請關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司其它相關(guān)文章!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。