golang 什麼是介面?
如果說goroutine和channel是Go並發的兩大基石,那麼介面就是Go語言程式設計中資料類型的關鍵。在Go語言的實際程式設計中,幾乎所有的資料結構都圍繞著介面展開,而介面是Go語言中所有資料結構的核心。
相關推薦:golang教學
golang中的介面
1. 介面
概念:介面定義了一組方法,但是不包含這些方法的具體實作;它們是抽象的,介面不能包含變數。
介面的定義格式
type Namer interface { method1() return_type method2() return_type }
2. 一個介面的栗子
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 讓編碼更靈活、易擴展,使得Go 擁有了物件導向多型的特性。
在此我們記住三點就夠了:
● 方法宣告的集合
● 任何類型的物件實作了在介面中宣告的全部方法,則表示該類型實作了對應介面。
● 可以作為一種資料類型,實作了該介面的任何物件都可以給對應的介面類型變數賦值。
結合例子去理解上述三點:
package main import "fmt" import "math" // 几何图形的接口(interface) type geometry interface { area() float64 perim() float64 } // rect 和 circle 实现 geometry 接口 type rect struct { width, height float64 } type circle struct { radius float64 } // 实现了接口中声明的所有方法即实现了该接口,这里 rects 实现了 geometry 接口 func (r rect) area() float64 { return r.width * r.height } func (r rect) perim() float64 { return 2*r.width + 2*r.height } // circles 实现 geometry 接口 func (c circle) area() float64 { return math.Pi * c.radius * c.radius } func (c circle) perim() float64 { return 2 * math.Pi * c.radius } // 定义的接口可以作为一种数据类型,当一个变量的类型为一个接口类型时,这个变量可以调用接口中定义的方法。 // 这里定义一个函数,接收一个类型为 geometry 的参数变量 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 结构类型都实现了 geometry 接口,所以我们能够把它们的对象作为参数传给 measure 函数 // 在 measure 函数内部,参数对象调用了所属类型实现的接口方法。 measure(r) measure(c) }
一種類型只要實現接口聲明的方法就算實現了接口,同樣一種類型能同時支持實現多個接口了,一個接口也能被多種類型實現。如果一種類型實作了某個接口,那麼這種類型的物件就能夠賦值給這個接口類型的變數。
package main import "fmt" type I interface { method1() } type T struct{} func (T) method1() {} func main() { var i I = T{} fmt.Println(i) }
最後的一部分解釋一下 interface{} 類型,這種類型的介面沒有宣告任何一個方法,俗稱空介面。因為任何類型的物件都預設實現了空接口(上文提到任意類型只要實現了接口的方法就算實現了對應的接口,由於空接口沒有方法,故所有類型默認都實現了空接口)在需要任意類型變數的場景下非常有用。
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中什麼是接口的詳細內容。更多資訊請關注PHP中文網其他相關文章!