栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

interface {}是什么意思?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

interface {}是什么意思?

您可以参考文章“ 如何在Go中使用接口 ”(基于“ Russ Cox对接口的描述
”):

什么 接口?

接口是两件事:

  • 这是一组方法,
  • 但这也是一种

interface{}
类型的 空接口 是没有方法的接口。

由于没有Implements关键字,所有类型都至少实现了零个方法,并且自动完成了一个接口的满足,所以 所有类型都满足空接口
这意味着,如果编写一个将

interface{}
值作为参数的函数,则 可以为该函数提供任何value

(这

Msg
代表您的问题:任何值)

func DoSomething(v interface{}) {   // ...}

这是令人困惑的地方:

在内部

DoSomething
功能, 是什么
v
的类型?

导致地鼠的人相信“

v
任何类型”,但这是错误的。
v
不是任何类型; 它是
interface{}
类型的

当将值传递给

DoSomething
函数时,Go运行时将执行 类型转换 (如有必要),
并将该值转换为
interface{}
value

所有值在运行时都只有一种类型,而
v
一个静态类型是
interface{}

接口值由两个数据字构成

  • 一个单词用于指向该值的基础类型的方法表,
  • 换句话讲,就是指向该值所保存的实际数据。

附录:这是Russ的关于接口结构的文章非常完整:

type Stringer interface {    String() string}

接口值表示为两字对,它给出了指向有关接口中存储的类型的信息的指针以及指向相关数据的指针。
将b分配给Stringer类型的接口值可设置接口值的两个字。

接口值中的第一个单词指向我所谓的接口表或itable (发音为i-table;在运行时源中,C实现名称为Itab)。
它以有关所涉及类型的一些元数据开始,然后成为函数指针的列表。
请注意,itable对应于接口类型,而不是动态类型

就我们的示例而言,可保存

Stringer
类型Binary的可列出性列出了用于满足Stringer的方法,而这些方法只是
String
:Binary的其他方法(
Get
)在中没有出现
itable

接口值中的第二个单词指向实际数据 ,在这种情况下为的副本

b

该赋值
var s Stringer = b
进行复制
b
而不是指向,
b
其原因与
var c uint64 =b
进行复制的原因相同:如果
b
以后进行更改,
s
并且
c
应该具有原始值,而不是新值。
存储在接口中的值可能任意大,但只有一个字专用于在接口结构中保存该值,因此该分配在堆上分配了一块内存,并将指针记录在一个字槽中。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/374186.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号