7.5 接口值

从概念上来讲,一个接口类型的值(简称接口值)其实有两个部分:一个具体类型和该类型的一个值。二者称为接口的动态类型和动态值。

对于像Go这样的静态类型语言,类型仅仅是一个编译时的概念,所以类型不是一个值。在我们的概念模型中,用类型描述符来提供每个类型的具体信息,比如它的名字和方法。对于一个接口值,类型部分就用对应的类型描述符来表述。

如下四个语句中,变量w有三个不同的值(最初和最后是同一个值):

接下来让我们详细地查看一下在每个语句之后w的值和相关的动态行为。第一个语句声明了w:

在Go语言中,变量总是初始化为一个特定的值,接口也不例外。接口的零值就是把它的动态类型和值都设置为nil,如图7-1所示。

一个接口值是否是nil取决于它的动态类型,所以现在这是一个nil接口值。可以用w==nil或者w!=nil来检测一个接口值是否是nil。调用一个nil接口的任何方法都会导致崩溃:

第二个语句把一个*os.File类型的值赋给了w:

这次赋值把一个具体类型隐式转换为一个接口类型,它与对应的显式转换io.Writer(os.Stdout)等价。不管这种类型的转换是隐式的还是显式的,它都可以转换操作数的类型和值。接口值的动态类型会设置为指针类型*os.File的类型描述符,它的动态值会设置为os.Stdout的副本,即一个指向代表进程的标准输出的os.File类型的指针,如图7-2所示。 ...

Get Go程序设计语言 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.