GO没有继承的概念,所以接口用来定义对象对应的方法名称,并不实现。如果我们定义的对象包含接口中的方法,那么就可以把对象赋值给定义为接口类型的变量。
如以下的代码中,MyFloat和 *Vertex均实现了Abs()方法,所以可以用接口的方式直接调用,而Vertex并没有实现Abs()方法,所以运行的时候,编译器会提示错误。
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 implements Abser
a = &v // a *Vertex implements Abser
//a = v // a Vertex, does NOT implement Abser
fmt.Println(a.Abs())
}