A1
interface
Duck Typing: 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子 目的: 在 Go 中,Interface(接口)只是一组方法集合。描述事物的外部行为而非内部结构。 通过接口实现多态的概念.
package main
import "fmt"
type Stringer interface {
String() string
}
// 接⼝嵌⼊
type Printer interface {
Stringer
Print()
}
type User struct {
id int
name string
}
func (self *User) String() string {
return fmt.Sprintf("user %d, %s", self.id, self.name)
}
func (self *User) Print() {
fmt.Println(self.String())
}
func dump(t Printer) {
t.String()
t.Print()
}
func main() {
u := User{1, "Tom"}
// 指针定义的方法只能传引用
dump(&u)
dump(u) // cannot use u (type User) as type Printer in argument to dump:
}
feature1:
- 不再需要继承体系,继承树。
- 实现类的时候,只关心其自身的方法,不用担心接口拆分的粒度。接口有使用方按需定义。减少事前规划。
- 无需为了实现某一个接口,引入外部包或者依赖。使用方也无需担心是否有其他模块定义过类似接口。
feature2:
- 接口只有方法签名,没有实现。
- 接⼝没有数据字段。
- 可在接⼝中嵌入其他接口。
- 类型可实现多个接口。
interface陷阱
接口描述,包括数据和类型
陷阱: 通过接口修改数据
数据指针持有的是目标对象的只读复制品,复制完整对象或指针。要传引用才能真正修改
陷阱:接口判nil
接⼝表存储元数据信息,包括接口类型、动态类型,以及实现接⼝的方法指针。
接口的类型和数据信息都为空时,接口才真正为nil