📦 归档笔记 — 原创建于 WizNote,仅作归档展示;观点以当年为准,非最新。

底层值为 nil 的接口值

创建时间2019-08-12最后修改2019-08-12原位置/程序员成长之旅/Go语言学习/笔记/字数169
目录:程序员成长之旅/Go语言学习/笔记

底层值为 nil 的接口值

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

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

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

package main

import "fmt"

type I interface {
	M()
}

type T struct {
	S string
}

func (t *T) M() {
	if t == nil {//注意这里判断了一下是否为nil
		fmt.Println("<nil>")
		return
	}
	fmt.Println(t.S)
}

func main() {
	var i I

	var t *T
	i = t
	describe(i)
	i.M()

	i = &T{"hello"}
	describe(i)
	i.M()
}

func describe(i I) {
	fmt.Printf("(%v, %T)\n", i, i)
}