zoukankan      html  css  js  c++  java
  • interface实现原理

    interface

    接口类型

    接口是一种抽象类型,它没有暴露所含数据的布局或者内部结构,当然也没有哪些数据的基本操作,所提供的仅仅是一些方法。当你拿到一个接口类型的变量,你无从知道它是什么,但你能知道它能做什么,或者更精确地讲,仅仅是它提供了哪些方法。

    接口定义

    Go语言提供了 interface关键字,接口中只能定义需要实现的方法,不能包含任何的变量

    Go语言中的接口类型会根据是否包含一组方法而分成两种不同的实现,分别为包含一组方法的iface结构体和不包含任何方法的eface结构体

    iface

    //runtime/runtime2.go
    type iface struct {
      tab  *itab
      data unsafe.Pointer
    //unsafe.Pointer类型是一种特殊类型的指针,它可以存储任何变量的地址(类似C语言的void*)
    }
    
    //runtime/runtime2.go
    type itab struct { 
      inter *interfacetype
      _type *_type
      hash  uint32 // copy of _type.hash. Used for type switches.
      _     [4]byte
      fun   [1]uintptr // variable sized. fun[0]==0 means _type does not implement inter.
    }
    //runtime/type.go
    type interfacetype struct {
      typ     _type
      pkgpath name
      mhdr    []imethod
    }
    

    itab用于表示具体类型和接口类型关系

    • inter 是接口类型定义信息
    • _type 是具体类型的信息
    • hash_type.hash的拷贝,在类型转换时,快速判断目标类型和接口中类型是否一致
    • fun是实现方法地址列表,虽然fun固定长度为1的数组,但是这其实是一个柔型数组,保存元素的数量是不确定的,如有多个方法,则会按照字典顺序排序

    interfacetype是描述接口定义的信息

    • _type 接口的类型信息
    • pkgpath 是定义接口的包名
    • mhdr 是接口中定义的函数表,按字典序排序

    eface

    //runtime/runtime2.go
    type eface struct {
      _type *_type
      data  unsafe.Pointer
    }
    

    参考

  • 相关阅读:
    吃一堑长一智
    人做事 天看着
    【转贴】英语中12个月名称的由来
    4199,流氓中的流氓
    【转贴】看D片容易误解的10个词组
    【转载】中国小吃(英文表达)
    拼死拼活为了啥!
    GCII 1.4对1.31改进
    上古III的汉化和美化修正
    linux下tar的用法
  • 原文地址:https://www.cnblogs.com/weiweng/p/13589441.html
Copyright © 2011-2022 走看看