interface {}的含义是什么?

用户:

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

我不明白

Msg interface{}

在此代码中:

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

type Body struct {
    Msg interface{}
}

我已经观察到相同的语法

fmt.Println

但不知道通过什么实现

interface{}
VonC:

您可以参考“ 如何在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/gointer2.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应该具有原始值,而不是新值。
存储在接口中的值可能任意大,但是只有一个字专用于保存接口结构中的值,因此该分配在堆上分配了一块内存,并将指针记录在一个字槽中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章