当前位置: 首页 > 面试题库 >

interface {}是什么意思?

陆飞鸿
2023-03-14
问题内容

我是接口的新手,并尝试通过github执行SOAP请求

我不明白

Msg interface{}

在此代码中:

type Envelope struct {
    Body `xml:"soap:"`
}

type Body struct {
    Msg interface{}
}

我已经观察到相同的语法

fmt.Println

但不知道通过什么实现

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类型的接口值可设置接口值的两个字。

http://research.swtch.com/<a href=gointer2.png" src="https://imgs.xnip.cn/cj/l/95/d9dc6e99-8eaf-48f5-b57b-f00efef427a5.png" />

接口值中的第一个单词指向我所谓的接口表或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应该具有原始值,而不是新值。
存储在接口中的值可能任意大,但只有一个字专用于在接口结构中保存该值,因此该分配在堆上分配了一块内存,并将指针记录在一个字槽中。



 类似资料:
  • 问题内容: 我一直遇到这个名词: 编程到接口。 这到底是什么意思?现实生活中的设计方案将受到高度赞赏。 问题答案: 简而言之,而不是像这样写类 我依靠这个特定的班级来做我的工作 你写的方式说 我依赖于任何类,做这个东西做我的工作。 第一个示例表示一个类,该类依赖于特定的具体实现来执行其工作。从本质上讲,这不是很灵活。 第二个示例表示写入接口的类。它不在乎您使用什么具体对象,而只是在意它实现某些行为

  • 问题内容: 在java int,float等中,是原始类型。如果我们需要将其与泛型一起使用,则使用包装器类。但是,以下声明在Java中仍然有效, 即使它是原始类型,如何调用? 问题答案: 原始对象成为对象 对于基元,在相应的包装器类中有一些名为TYPE的常量的Class对象可用-即,int.class更改为java.lang.Integer.TYPE。对于其他类型,编译器在正在编译的类中创建一个私

  • 问题内容: 我目前正在(恢复)使用EJB的速度,而当我离开时,它发生了巨大的变化(到目前为止更好)。但是,我遇到了一个我正在苦苦挣扎的概念,并且想更好地理解它,因为它似乎在我们的代码中使用了(我工作的地方,而不是我和我所有的声音)。 这是我在一本书中找到的示例。这是显示如何使用注释的示例的一部分: 的类是一个相当简单的类来定义对:和。 哦,我从Rubinger&Burke的O’Reilly的Ent

  • 问题内容: 什么是POSIX?我已阅读Wikipedia文章,并且每次遇到该术语时都会阅读。事实是我从来没有真正了解过它是什么。 有人可以通过解释“ POSIX的需求”来向我解释吗? 问题答案: POSIX是IEEE指定的一系列标准,用于阐明和统一Unix- y操作系统提供的应用程序编程接口(以及附属问题,例如命令行外壳实用程序)。当您编写依赖于POSIX标准的程序时,可以肯定地将它们轻松移植到大

  • 本文向大家介绍NULL是什么意思?相关面试题,主要包含被问及NULL是什么意思?时的应答技巧和注意事项,需要的朋友参考一下 NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。 对NULL这个值的任何比较都会生产一个NULL值。 您不能把任何值与一个 NULL值进行比较,并在逻辑上希望获得一个答案。 使用IS NULL来进行NULL判断

  • 问题内容: 这是什么意思? 问题答案: 在jQuery中,属性只是该属性的别名。 标识符(或)只是一个 构造函数 ,使用该标识符创建的所有实例都从构造函数的原型继承。 一个简单的构造函数: 一个类似于jQuery体系结构的简单结构: