介面 介面類型是對其它類型行為的抽象和概括,因為介面類型不會和特定的實現細節綁定在一 起,通過這種抽象的方式我們可以讓我們的函數更加靈活和更具有適應能力 介面的特點 可以包含0個或多個方法的簽名 只定義方法的簽名,不包含實現 實現介面不需要顯式的聲明,只需實現相應方法即可 介面實現 介面里沒 ...
介面
介面類型是對其它類型行為的抽象和概括,因為介面類型不會和特定的實現細節綁定在一 起,通過這種抽象的方式我們可以讓我們的函數更加靈活和更具有適應能力
介面的特點
- 可以包含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()
}