day05-go interface

作者: Winnifred_ | 来源:发表于2020-05-08 13:52 被阅读0次

今天研究一下interface

https://mp.weixin.qq.com/s/EbxkBokYBajkCR-MazL0ZA

1.go语言是一门静态语言,但是通过接口实现了鸭子类型

2.值接收者和指针接受者的区别

调用方法的时候,值类型既可以调用值接收者的方法,也可以调用指针接收者的方法;指针类型既可以调用指针接收者的方法,也可以调用值接收者的方法。-----只有方法,不含接口时

如果实现了接收者是值类型的方法,会隐含地也实现了接收者是指针类型的方法

两者使用区分:

方法能够修改接收者指向的值。避免在每次调用方法时复制该值,在值的类型为大型结构体时,这样做会更加高效。如果类型的成员都是由 Go 语言里内置的原始类型,如字符串,整型值等,那就定义值接收者类型的方法。像内置的引用类型,如 slice,map,interface,channel,这些类型比较特殊,声明他们的时候,实际上是创建了一个 header, 对于他们也是直接定义值接收者类型的方法。这样,调用函数时,是直接 copy 了这些类型的 header,而 header 本身就是为复制设计的。

3.iface 和 eface 的区别是什么

iface的结构type iface struct {    tab  *itab    data unsafe.Pointer}

type iface struct {    tab  *itab    data unsafe.Pointer},itab结构体中inter interfacetype中的mhdr表示接口所定义的函数列表, data是数据指针,则指向具体的数据。它们分别被称为动态类型和动态值

而eface只维护了一个type字段type eface struct {    _type *_type    data  unsafe.Pointer}

可以看到eface的_type和iface中interfacetype中的_type,go中的语言类型都是基于这个结构体的,这就是反射的基础

4.类型转换和断言

类型转换:<结果类型> := <目标类型> (<表达式>)

断言:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) 

5.接口转换的原理    ------有些难懂,需看原文

当判定一种类型是否满足某个接口时,Go 使用类型的方法集和接口所需要的方法集进行匹配,如果类型的方法集完全包含接口的方法集,则可认为该类型实现了该接口

(1.具体类型转空接口时,_type 字段直接复制源类型的 _type;调用 mallocgc 获得一块新内存,把值复制进去,data 再指向这块新内存。

(2.具体类型转非空接口时,入参 tab 是编译器在编译阶段预先生成好的,新接口 tab 字段直接指向入参 tab 指向的 itab;调用 mallocgc 获得一块新内存,把值复制进去,data 再指向这块新内存。

(3.而对于接口转接口,itab 调用 getitab 函数获取。只用生成一次,之后直接从 hash 表中获取。

6.interface实现多态

(1. 一种类型具有多种类型的能力

(2.允许不同的对象对同一消息做出灵活的反应

(3.以一种通用的方式对待个使用的对象

(4.非动态语言必须通过继承和接口的方式来实现

相关文章

  • day05-go interface

    今天研究一下interface https://mp.weixin.qq.com/s/EbxkBokYBajkCR...

  • interface{} 与 []interface{}

    简介 基于可以对interface{}赋值任何类型的变量,很多人会尝试如下的代码: 很不幸会导致错误: 于是问题来...

  • Interface

    Interface is a group of method signatures, continuin with...

  • Interface

    为什么interface中的变量都是static public final? 首先接口是一种高度抽象的"模版",,...

  • interface

    接口用于定义对象的 '轮廓' 但是如果我们直接传入一个对象字面量进去,ts就会报错, 因为ts对对象字面量检测更加...

  • interface

    http://blog.csdn.net/justaipanda/article/details/43155949...

  • @interface

    深入理解Java:注解(Annotation)自定义注解入门http://www.cnblogs.com/peid...

  • Interface

    4.1 Comma Separated Value. *Comma Separated Value *or CSV...

  • interface

    由于基础很差不太明白interface到底是个啥接口上我一直不太理解,插上就通电了......通电什么意思 插曲最...

  • interface

    java语言里面使用interface来声明一个接口,接口其实是一个特殊的抽象类,在接口里面的方法全部都是抽象的。...

网友评论

    本文标题:day05-go interface

    本文链接:https://www.haomeiwen.com/subject/itnxnhtx.html