首页 >后端开发 >Golang >为什么检索接口值的指针会引发异常?

为什么检索接口值的指针会引发异常?

Patricia Arquette
Patricia Arquette原创
2024-10-28 19:18:02304浏览

Why Does Retrieving Pointers to Interfaced Values Raise an Exception?

检索指向接口值的指针

尝试获取指向存储在接口中的值的指针可能会引发异常,如下所示代码如下:

<code class="go">import "container/list"

type retry struct{}

el := list.New().PushBack(retry{})
p := &el.Value.(retry)</code>

这会导致错误,指出无法获取 el.Value.(retry) 的地址。这种行为不仅限于结构体;它适用于存储在接口中的任何类型。

理解接口值表示

要理解此限制,请考虑接口值的内部表示。它由两个单词组成:

  • 第一个单词包含所包含值的类型信息。
  • 第二个单词存储值本身(如果它适合一个单词)或指向其存储的指针(如果值超出字长)。

至关重要的是,所包含的值由接口变量拥有。此外,当将新值分配给接口时,可以重用该值的存储。

允许指针检索的后果

理解这些原则,请考虑以下内容代码:

<code class="go">var v interface{}
v = int(42)
p := GetPointerToInterfaceValue(&v) // a pointer to an integer holding 42
v = &SomeStruct{...}</code>

这里,用于整数的存储已被重新用于保存指向结构的指针。因此,取消引用 *p 现在会生成指向 SomeStruct 的指针的整数表示形式。此行为有可能破坏类型系统。

替代解决方案

要避免此问题,请考虑在列表中存储指向结构的指针而不是结构本身。或者,您可以传递 *list.Element 值作为对所包含结构的引用。

以上是为什么检索接口值的指针会引发异常?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn