前提条件:对go中函数和方法这个概念有了解。
go接口描述:
- 接口类型是由一组方法定义的集合。如何理解?接口的类型是一个集合,这个集合里面包含各种各样的方法。
- 接口类型的值可以存放实现这些方法的任何值。如何理解?定义一个接口类型的变量,这个变量可以被赋值为任何实现了接口类型中方法的类型的对象。
代码讲解:
package main
import (
"fmt"
"math"
)
type MyFloat float64
func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
type Abser interface {
Abs() float64
}
func main() {
var a Abser
f := MyFloat(-math.Sqrt2)
v := Vertex{3, 4}
a = f // a MyFloat 实现了 Abser
a = &v // a *Vertex 实现了 Abser
fmt.Println(a.Abs())
}
跟c++类比的话,与多态有些类似。多态的核心是:利用父类指针调用子类方法。go中接口也可以总结为:利用接口对象a,调用实现类型MyFloat/Vertex的方法。
注意点:
由于abs()方法绑定到的是Vertex指针类型上,所以Vertex本身类型是不能实现Abser接口的。