接口

接口类型 是由一组方法签名定义的集合。

接口类型的变量可以保存任何实现了这些方法的值。

注意: 示例代码的 22 行存在一个错误。由于 Abs 方法只为 *Vertex (指针类型)定义,因此 Vertex(值类型)并未实现 Abser

interfaces.go

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. type Abser interface {
  7. Abs() float64
  8. }
  9. func main() {
  10. var a Abser
  11. f := MyFloat(-math.Sqrt2)
  12. v := Vertex{3, 4}
  13. a = f // a MyFloat 实现了 Abser
  14. a = &v // a *Vertex 实现了 Abser
  15. // 下面一行,v 是一个 Vertex(而不是 *Vertex)
  16. // 所以没有实现 Abser。
  17. a = v
  18. fmt.Println(a.Abs())
  19. }
  20. type MyFloat float64
  21. func (f MyFloat) Abs() float64 {
  22. if f < 0 {
  23. return float64(-f)
  24. }
  25. return float64(f)
  26. }
  27. type Vertex struct {
  28. X, Y float64
  29. }
  30. func (v *Vertex) Abs() float64 {
  31. return math.Sqrt(v.X*v.X + v.Y*v.Y)
  32. }