GO interface实现分析

本文介绍了Go语言中接口(interface)的内部实现、nil interface和nil的区别以及使用时的一些坑。上篇文章回顾:Elasticsearch SQL用法详解前言接口(interface)代表一种“约定”或“协议”,是多个方法声明的集合。允许在非显示关联情况下,组合并调用其它类型的方法。接口无需依赖类型,带来的优点就是减少调用者可视化方法,隐藏类型内部结构和具体方法实现细...
摘要由CSDN通过智能技术生成
本文介绍了Go语言中接口(interface)的内部实现、nil interface和nil的区别以及使用时的一些坑。
上篇文章回顾: Elasticsearch SQL用法详解

前言

接口(interface)代表一种“约定”或“协议”,是多个方法声明的集合。允许在非显示关联情况下,组合并调用其它类型的方法。接口无需依赖类型,带来的优点就是减少调用者可视化方法,隐藏类型内部结构和具体方法实现细节。虽然接口的优点有很多,但是接口的实现是在运行期实现的,所以存在其它额外的开销。在日常开发过程中是否选择接口需要根据场景进行合理的选择。

1、接口定义

一个接口需要包括方法签名,方法签名包括:方法名称、参数和返回列表。接口内不能有字段,而且不能定义自己的方法,这主要是由于字段和方法的定义需要分配内存。

package main

import (
    "fmt"
    "reflect"
)
    
type Ser interfacee {
    A(a int)
    B()
}

type X int
func (X) A(b int) {}
func (*X) B() {}

var o X
var _ Ser = &o

func main() {}复制代码

>>>>1.1 如何确保类型实现接口

Go语言接口是隐式实现的,这意味着开发人员不需要声明它实现的接口。虽然这通常非常方便,但在某些情况下可能需要明确检查接口的实现。最好的方法就是依赖编译器实现,例如:

package main

type Jedi interface {
    HasForce() bool
}

type Knight struct {}

var _ Jedi = (*Knight)(nil)       // 利用编译器检查接口实现

func main() {}复制代码

2、接口内部实现

接口调用是通过所属于它的方法集进行调用,而类型调用则通过它所属于的方法进行调用,它们之间有本质的差别。接下来说说接口是如何实现的,以及如何获取接口的方法集。

>>>>2.1 接口内部实现

runtime中有两种方式对接口实现,一种是iface类型,另一种是eface。

// 接口内包含有方法的实现
type iface struct {
    tab  *itab
    data unsafe.Pointer     // 实际对象指针
}

// 类型信息
type itab struct {
    inter *interfacetype    // 接口类型
    _type *_type            // 实际类型对象
    fun   [1]uintptr        // 实际对象方法地址
}

// 接口内不包含方法的实现,即nil interface.
type eface struct {
    _type *_type
    data  unsafe.Pointer
}复制代码

>>>>2.2 按值实现接口和按指针实现接口区别

2.2.1 按值实现接口

type T struct {}
type Ter interface{
    A()
    B()
}

func(t T) A(){}
func(t *T) B(){}

var o T
var i Ter = o复制代码

当将o实现接口Ter时,其实是将T类型内存拷贝一份,然后i.data指向新生成复制品的内存地址。当调用i.A()方法时,经过以下3个步骤:

1. 通过i.(*data)变量获取复制品内的内容。

2

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值