底层值为 nil 的接口值

即便接口内的具体值为 nil,方法仍然会被 nil 接收者调用。

在一些语言中,这会触发一个空指针异常,但在 Go 中通常会写一些方法来优雅地处理它(如本例中的 M 方法)。

注意: 保存了 nil 具体值的接口其自身并不为 nil。

interface-values-with-nil.go

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