• 21天从Java转向Go之第八天——水滴石穿(接口)


    接口

    • 一个接口类型定义了一套方法,如果一个具体类型要实现该接口,那么必须实现接口类型定义中的所有方法。

    接口声明

    • 接口字面量语法
    
    interface {
    
      MethodSignature1
    
      MethodSignature2
    
    }
    
    
    • 接口命名类型使用Type
    
    type InterfaceName interface{
    
      MethodSignature1
    
      MethodSignature2
    
    }
    
    
    • 空接口 interface{}

    • 接口的命名一般以“er ”结尾

    • 接口定义的方法声明不需要func引导

    • 在接口定义中,只有方法声明没有方法实现。

    接口初始化

    • 实例赋值接口,如果具体类型的实例的方法集是某个接口的方法集的超集,则该具体类型实现了接口,可将该类型的具体实例赋值给接口类型的变量。接口被初始化后,调用接口的方法就相当于调用接口绑定的具体类型的方法。

    • 接口变量赋值给接口变量

    已经初始化的接口类型变量a 直接赋值给另一种接口变量b ,要求 b方法集是a 的方法
    的子集。此时 Go 编译器会在编译时进行方法集静态检查。这个过程也是接口初始化的
    方式,此时接口变量b绑定的具体实例是接口变量a绑定的具体实例的副本。

    接口方法调用

    • 接口方法调用和普通的函数调用是有区别的。接口方法调用的最终地址是在运行期决定的,将具体类型变量赋值给接口后,会使用具体类型的方法指针初始化接口变量,当调用接口变量
      的方法时,实际上是间接地调用实例的方法。接口方法调用不是一种直接的调用,有一定的运
      行时开销。直接调用未初始化的接口变量的方法会产生panic。

    接口的动态类型和静态类型

    • 动态类型:接口绑定的具体实例的类型称为接口的动态类型。接口可以绑定不同类型的实例,
    • 静态类型:接口定义时,其类型已经被确定。这个类型叫做接口的静态类型。接口的静态类型在其定义时就被确定,静态类型的本质特征就是接口的方法签名集合。

    接口的运算

    类型断言

    i.(TypeName)
    
    • i必须是接口变量,如果TypeName是一个具体类型名,则类型断言用于判断接口变量i绑定的实例类型是否就是具体类型。如果是接口类型名,则类型断言用于判断接口变量i绑定的实例类型是否同时实现了TypeName接口

    接口断言的两种语法

    • 直接赋值模式
    o:=i.(TypeName)
    
    • comma,ok表达式
    if v,ok := i.(TypeName);ok {
      
    }
    

    类型查询

    switch type := i.(TypeName)
    case type`:
      xxx
    case type2:
     xxx
    default:
     xxx
    
  • 相关阅读:
    安卓开发学习——事件机制
    安卓开发学习——消息机制与异步任务
    安卓存储学习
    scrollTop, pageYOffset, scrollY 以及offsetTop 的区别
    BFC与IFC概念理解+布局规则+形成方法+用处
    JavaScript的作用域、作用域链和执行期上下文
    深入理解javascript原型和闭包系列
    【剑指Offer】剑指offer题目汇总
    CSS文件加载方式: @import 和 <link>
    jquery跨域:$.ajax 和$.getJSON
  • 原文地址:https://www.cnblogs.com/perkins/p/15625629.html
Copyright © 2020-2023  润新知