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

那么内存布局意味着[] T无法在Go中转换为[]接口?

魏鹤轩
2023-03-14
问题内容

所以我一直在阅读这两篇文章和这个答案

无法将 string转换为 interface表示需要更改内存布局。

http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-
go
表示,了解基本内存可以轻松回答此问题,并且

http://research.swtch.com/interfaces,解释了到底发生了什么。

但是对于我来说,就接口的实现而言,我无法想到一个原因,即为什么无法将[] T强制转换为[] interface。

所以为什么?


问题答案:

文章“ InterfaceSlice
”尝试详细说明:

类型变量[]interface{}不是接口!这是一个切片,其元素类型恰好是interface{}。但是即使这样,也可以说含义很清楚。

好吧 具有类型的变量具有[]interface{}特定的内存布局,在编译时已知。

每个interface{}单词占用两个单词(一个单词表示所包含内容的类型,另一个单词表示所包含的数据或指向它的指针)。结果,长度为N和类型的切片[]interface{}由N * 2个字长的数据块支持。

另请参阅“
golang中的含义是interface{}什么?

2个字

这与支持具有类型[]MyType和相同长度的切片的数据块不同。它的数据块将是N*sizeof(MyType)字长。

结果是您不能快速将某类型[]MyType的东西分配给某种类型的东西[]interface{};它们背后的数据看起来不同。


为什么[]string不能[]interface{}在Go中转换为”添加了一个很好的例子:

// imagine this is possible
var sliceOfInterface = []interface{}(sliceOfStrings)
// since it's array of interface{} now - we can do anything
// let's put integer into the first position
sliceOfInterface[0] = 1
// sliceOfStrings still points to the same array, and now "one" is replaced by 1
fmt.Println(strings.ToUpper(sliceOfStrings[0])) // BANG!


 类似资料:
  • 问题内容: 我有这个时间戳值由Web服务返回 我知道这意味着时区,但是那到底是什么意思呢? 而且我正在尝试模拟此Web服务,因此有没有办法在python中使用生成此时间戳的方法? 很抱歉,如果这很明显,但Google的帮助不是很大,参考页面也没有。 我目前正在使用这个: 问题答案: 在并没有真正纳入什么。这仅仅是 分隔 的ISO 8601相结合的日期时间格式 要求。您可以将其阅读为 Time 的缩

  • 我想创建一个

  • 我正在阅读在进入SQL查询之前是否需要转义$_session['username']?它说“您需要转义传递给sql查询的每个字符串,而不管它的来源是什么”。现在我知道像这样的东西是非常基本的。谷歌搜索结果超过2万个。仅Stackoverflow就有20页的结果,但没有人真正解释什么是转义字符串,或者如何转义字符串。这只是假设。你能帮帮我吗?我想学习,因为我一直在用PHP制作一个web应用程序。 我

  • 问题内容: 我了解这是用来创建别名的。因此,将一个长名称别名为一个短名称是有意义的。但是,我看到一个查询 ,这意味着什么? 问题答案: 可以以多种方式使用别名,而不仅仅是缩短长列名。 在这种情况下,您的示例意味着您将返回一列始终包含的列,并且其别名/列名称为。 当您使用计算值(例如)时,也可以使用别名。

  • 在扩展元数据类中,它表示“类包含描述SAML实体的附加信息。元数据既可以用于本地实体*(=使用SAML扩展作为部署的应用程序的一部分可以访问的实体)也可以用于远程实体(=用户可以与类似IDP交互的实体)。” 我没有遵循“本地实体”的含义。在我的例子中,我们使用shibboleth idp和服务提供商作为部署在tomcat中的spring web应用程序。

  • 问题内容: 下面是代码片段。 有人可以向我解释@符号在Java中的含义吗? 问题答案: 这是一个注释。 注释是元数据的一种形式。它们提供的程序数据不属于程序本身。注释对其注释的代码的操作没有直接影响。 注释确实会影响工具和库对待程序的方式,进而会影响正在运行的程序的语义。可以从源文件,类文件中读取注释,也可以在运行时从中读取注释。