在 Golang 中,interface 由两部分组成:类型和值。类型表示实现该接口的类型,值表示该类型的值。当我们将一个类型的值赋给一个 interface 类型的变量时,编译器会将该值的类型和值分别保存在 interface 变量中。
在上面的例子中,我们创建了一个 “Animal” 类型的变量,并将它赋值为一个 “Dog” 类型的变量。在这个过程中,编译器会将 “Dog” 类型和它的值保存在 “Animal” 类型的变量中。
当我们通过 interface 变量调用一个方法时,编译器会根据类型和值查找该方法,并调用它。在上面的例子中,当我们通过 “animal” 变量调用 “Move” 方法时,编译器会查找 “Dog” 类型实现的 “Move” 方法,并调用它。因为 Dog” 类型实现了 “Animal” 接口,所以 “Dog” 类型的值可以被赋给 “Animal” 类型的变量,并可以通过 “Animal” 类型的变量调用 “Animal” 接口中定义的方法。