type Traversal interface {
Traverse()
}
func main() {
traversal := getTraversal()
traversal.Traverse()
}
duck typing
- 描述事物的外部行为而非内部结构
-
golang
类似duck typing -
golang
中接口是由使用者定义的 - 实现者只需要实现接口的方法就可以
接口的内部实现
- 接口中包含实现者的类型和实现者的值/实现者的指针
将实现者赋值给接口变量时有两种方式:值赋值和指针赋值
- 值赋值是将实现者的值赋给接口的内部变量
- 指针赋值是将实现者的指针赋值给接口的内部变量
接口的指针赋值只能将实现者的指针赋值给接口变量
接口的值赋值既可以将实现者的指针赋值给接口变量又可以将值赋值给接口变量
一般不使用接口的指针,因为可以将指针封装到接口实现的内部
查看接口的类型:
//Type Switch
switch v := r.(type) { //r是接口变量
case mock.Retriever:
fmt.Println("Contents:", v.Contents)
case *real.Retriever:
fmt.Println("UserAgent:", v.UserAgent)
}
or
//Type Assertion
if mockRetriever, ok := r.(*mock.Retriever); ok {
fmt.Println(mockRetriever.Contents)
} else {
fmt.Println("r is not a mock retriever")
}
golang
中的任何类型interface{}
r.(int)
:取出r
中的int
类型数据,当r
中的数据类型不是int
时会在运行时报错
接口的组合
有疑问加站长微信联系(非本文作者)