dog := Dog{"little pig"}
var pet Pet = &dog
我们声明并初始化一个Dog类型的变量dog,然后它的指针赋给类型为Pet的变量pet
对于一个接口类型的变量来讲, 如上面的变量pet,我们赋给它的值可以被叫做它的实际值(也称之为动态值),而该值的类型可以被叫做这个变量的实际类型(也成为动态类型)
比如上面我们将取址表达式&dog
的结果值赋值给了变量pet,这个时候表达式的结果值就是变量pet的动态值,而此结果值的类型*dog
就是这个变量的动态类型。
动态类型是相对静态类型来讲的,对于变量pet来讲, 它的静态类型就是pet, 并且永远是Pet, 但是它的动态类型确会随着我们赋给它的动态值而变化
比如, 只有我把一个*Dog
类型的值赋给变量pet之后, 该变量的动态类型才会是*Dog
, 如果还有一个Pet接口的实现类型*Flsh
,并且我又把一个此类型的值赋值给了pet, 那么它的动态类型就变成了*Fish