接口值

接口也是值。它们可以像其它值一样传递。

接口值可以用作函数的参数或返回值。

在内部,接口值可以看做包含值和具体类型的元组:

  1. (value, type)

接口值保存了一个具体底层类型的具体值。

接口值调用方法时会执行其底层类型的同名方法。

interface-values.go

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. type I interface {
  7. M()
  8. }
  9. type T struct {
  10. S string
  11. }
  12. func (t *T) M() {
  13. fmt.Println(t.S)
  14. }
  15. type F float64
  16. func (f F) M() {
  17. fmt.Println(f)
  18. }
  19. func main() {
  20. var i I
  21. i = &T{"Hello"}
  22. describe(i)
  23. i.M()
  24. i = F(math.Pi)
  25. describe(i)
  26. i.M()
  27. }
  28. func describe(i I) {
  29. fmt.Printf("(%v, %T)\n", i, i)
  30. }