概念上讲一个接口的值,接口值,由两个部分组成,一个具体的类型和那个类型的值。它们 被称为接口的动态类型和动态值。对于像Go语言这种静态类型的语言,类型是编译期的概 念;因此一个类型不是一个值。在我们的概念模型中,一些提供每个类型信息的值被称为类 型描述符,比如类型的名称和方法。在一个接口值中,类型部分代表与之相关类型的描述 符。
下面4个语句中,变量w得到了3个不同的值。(开始和最后的值是相同的)
var w io.Writer
w = os.Stdout
w = new(bytes.Buffer)
w = nil
让我们进一步观察在每一个语句后的w变量的值和动态行为。第一个语句定义了变量w
var w io.Writer
在Go语言中,变量总是被一个定义明确的值初始化,即使接口类型也不例外。对于一个接口 的零值就是它的类型和值的部分都是nil。
一个接口值基于它的动态类型被描述为空或非空,所以这是一个空的接口值。你可以通过使 用w==nil或者w!=nil来判读接口值是否为空。调用一个空接口值上的任意方法都会产生panic:
w.Write([]byte("hello")) // panic: nil pointer dereference<