介面
? 介面型別是對其它型別行為的抽象和概括,因為介面型別不會和特定的實作細節系結在一 起,通過這種抽象的方式我們可以讓我們的函式更加靈活和更具有適應能力
介面的特點
- 可以包含0個或多個方法的簽名
- 只定義方法的簽名,不包含實作
- 實作介面不需要顯式的宣告,只需實作相應方法即可
介面實作
? 介面里沒有具體的方法實作,只有方法宣告!!!
type ShowInfo interface {
ShowColor()
ShowArea()
}
? 如果一個變數含有了多個interface型別的方法,那么這個變數就實作了多個介面,如果一個變數只含有了1個interface的方部分方法,那么這個變數沒有實作這個介面
// 定義一個結構體Triangle,實作上述的兩個方法
type Triangle struct {
Color string
Padding string
Area int
}
func (triangle Triangle) ShowArea() {
fmt.Printf("Triangle Area: %d\n", triangle.Area)
}
func (triangle Triangle) ShowColor() {
fmt.Printf("Triangle Color: %s\n", triangle.Color)
}
// 定義一個結構體Circle,只實作一個方法
// 因為沒有實作上述介面的所有方法,因此沒有實作這個介面!!!
type Circle struct {
Color string
Padding string
Area int
}
func (circle Circle) ShowArea() {
fmt.Printf("Circle Area: %d\n", circle.Area)
}
介面使用
? 介面型別為一般型別
func main() {
circle01 := Circle{
Color: "Red",
Padding: "24px",
Area: 300,
}
triangle01 := Triangle{
Color: "Yellow",
Padding: "12px",
Area: 2000,
}
Showinfo(circle01) // 傳入的是Circle 呼叫的就是Circle里的方法
Showinfo(triangle01) // 傳入的是Triangle 呼叫的就是Triangle里的方法
}
// 兩種不同的結構體使用介面的方法是一樣的,介面自動判斷呼叫各自的方法
func Showinfo(tmp ShowInfo) {
tmp.ShowArea()
tmp.ShowColor()
}
介面斷言
? 因為介面為一般型別,如果我們需要知道傳進去的到底是什么型別,那么就需要用(type-switch-case)來進行介面斷言
func Showinfo(tmp ShowInfo) {
// 介面斷言
switch tmp.(type) {
// 如果傳進去的是Triangle
case Triangle:
fmt.Printf("These are Triangle's info:\n")
// 如果傳進去的是Circle
case Circle:
fmt.Printf("These are Circle's info:\n")
}
tmp.ShowArea()
tmp.ShowColor()
}
介面嵌套
? 介面于介面直接也可以進行嵌套
// 介面ShowColor
type ShowColor interface {
ShowColor()
}
// 介面ShowArea
type ShowArea interface {
ShowArea()
}
// 介面ShowInfo,嵌套了上述兩個介面
type ShowInfo interface {
ShowArea
ShowColor
}
//嵌套介面的使用
func Showinfo(tmp ShowInfo) {
switch tmp.(type) {
case Triangle:
fmt.Printf("These are Triangle's info:\n")
case Circle:
fmt.Printf("These are Circle's info:\n")
}
tmp.ShowArea()
tmp.ShowColor()
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/549964.html
標籤:其他
上一篇:學習Python第一天
