gpt4 book ai didi

pointers - 在接口(interface)内获取值的地址

转载 作者:IT王子 更新时间:2023-10-29 01:23:25 28 4
gpt4 key购买 nike

如何获取接口(interface)内值的地址?

我有一个结构存储在接口(interface)中,在 list.List 元素中:

import "container/list"
type retry struct{}
p := &el.Value.(retry)

但是我明白了:

cannot take the address of el.Value.(retry)

这是怎么回事?既然结构存储在接口(interface)中,为什么我不能得到指向它的指针?

最佳答案

要理解为什么这是不可能的,考虑一下接口(interface)变量的实际含义会很有帮助。接口(interface)值占用两个词,第一个描述包含值的类型,第二个要么 (a) 保存包含的值(如果它适合该词)或 (b) 指向存储值的指针 (如果该值不适合一个词)。

需要注意的重要事项是 (1) 包含的值属于接口(interface)变量,以及 (2) 当为变量分配新值时,可以重用该值的存储。知道这一点,请考虑以下代码:

var v interface{}
v = int(42)
p := GetPointerToInterfaceValue(&v) // a pointer to an integer holding 42
v = &SomeStruct{...}

现在,整数的存储空间已被重新用于保存指针,*p 现在是该指针的整数表示。您可以看到它如何能够破坏类型系统,因此 Go 没有提供这样做的方法(除了使用 unsafe 包之外)。

如果您需要指向存储在列表中的结构的指针,那么一种选择是将指向结构的指针存储在列表中,而不是直接存储结构值。或者,您可以传递 *list.Element 值作为对包含的结构的引用。

关于pointers - 在接口(interface)内获取值的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15518919/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com