接口
接口类型是对其它类型行为的抽象和概括,因为接口类型不会和特定的实现细节绑定在一 起,通过这种抽象的方式我们可以让我们的函数更加灵活和更具有适应能力
接口的特点
- 可以包含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()
}
文章评论