接口

接口类型是一种抽象类型,是方法的集合,其他类型实现了这些方法就是实现了这个接口。

  1. /* 定义接口 */
  2. type interface_name interface {
  3. method_name1 [return_type]
  4. method_name2 [return_type]
  5. method_name3 [return_type]
  6. ...
  7. method_namen [return_type]
  8. }

简单示例:打印不同几何图形的面积和周长

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. type geometry interface {
  7. area() float32
  8. perim() float32
  9. }
  10. type rect struct {
  11. len, wid float32
  12. }
  13. func (r rect) area() float32 {
  14. return r.len * r.wid
  15. }
  16. func (r rect) perim() float32 {
  17. return 2 * (r.len + r.wid)
  18. }
  19. type circle struct {
  20. radius float32
  21. }
  22. func (c circle) area() float32 {
  23. return math.Pi * c.radius * c.radius
  24. }
  25. func (c circle) perim() float32 {
  26. return 2 * math.Pi * c.radius
  27. }
  28. func show(name string, param interface{}) {
  29. switch param.(type) {
  30. case geometry:
  31. // 类型断言
  32. fmt.Printf("area of %v is %v \n", name, param.(geometry).area())
  33. fmt.Printf("perim of %v is %v \n", name, param.(geometry).perim())
  34. default:
  35. fmt.Println("wrong type!")
  36. }
  37. }
  38. func main() {
  39. rec := rect{
  40. len: 1,
  41. wid: 2,
  42. }
  43. show("rect", rec)
  44. cir := circle{
  45. radius: 1,
  46. }
  47. show("circle", cir)
  48. show("test", "test param")
  49. }

接口中可以内嵌接口

对上述例子做以下修改:

  • 首先添加 tmp 接口,该接口定义了 area() 方法
  • tmp 作为 geometry 接口中的匿名成员,并且将 geometry 接口中原本定义的 area() 方法删除

完成以上两步后,geometry 接口将会拥有 tmp 接口所定义的所有方法。运行结果和上述例子相同。

  1. type tmp interface{
  2. area() float32
  3. }
  4. type geometry interface {
  5. // area() float32
  6. tmp
  7. perim() float32
  8. }