1. type Traversal interface {
  2. Traverse()
  3. }
  4. func main() {
  5. traversal := getTraversal()
  6. traversal.Traverse()
  7. }

what

接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的)。接口里也不能包含变量。

  1. type Namer interface {
  2. Method1(param_list) return_type
  3. Method2(param_list) return_type
  4. ...
  5. }

why

通过接口,我们可以整合一组方法或者行为,这个在任何编程语言里面都是想通的。这样的话,相当于在功能的定义和消费者之间设置了一层抽象。书写接口的一方,不需要实现接口方法的业务细节。这样保证了各个组件功能的清晰。
你可以通过接口实现很多别的方式无法实现的酷炫功能。例如,你创建了很多组件,他们通过某段代码以相同的方式进行交互,组件再大也无所谓。这样的话,在我们切换组件的时候,就可以无缝衔接,甚至可以在运行时动态的交换

作者:JYSDeveloper
链接:https://www.jianshu.com/p/1f740932054a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

how

接口由使用者定义
接口的实现是隐式的
只需要实现接口里的方法

接口的嵌套

  1. type ReadWrite interface {
  2. Read(b Buffer) bool
  3. Write(b Buffer) bool
  4. }
  5. type Lock interface {
  6. Lock()
  7. Unlock()
  8. }
  9. type File interface {
  10. ReadWrite
  11. Lock
  12. Close()
  13. }

类型判断:type-switch

  1. switch t := areaIntf.(type) {
  2. case *Square:
  3. fmt.Printf("Type Square %T with value %v\n", t, t)
  4. case *Circle:
  5. fmt.Printf("Type Circle %T with value %v\n", t, t)
  6. case nil:
  7. fmt.Printf("nil value: nothing to check?\n")
  8. default:
  9. fmt.Printf("Unexpected type %T\n", t)
  10. }

类型断言:如何检测和转换接口变量的类型

一个接口类型的变量 varI 中可以包含任何类型的值,必须有一种方式来检测它的 动态 类型,即运行时在变量中存储的值的实际类型。
我们可以使用 类型断言 来测试在某个时刻 varI 是否包含类型 T 的值
v := varI.(T)
varI 必须是一个接口变量,否则编译器会报错
类型断言可能是无效的,虽然编译器会尽力检查转换是否有效,但是它不可能预见所有的可能性。如果转换在程序运行时失败会导致错误发生。

  1. if v, ok := varI.(T); ok { // checked type assertion
  2. Process(v)
  3. return
  4. }
  5. // varI is not of type T