如何将interface {}转换为结构指针?

时间:2018-07-17 10:25:38

标签: dictionary pointers go struct interface

接口已经包含指向值的指针,在我的情况下,它是一个结构体,我需要从接口{}中获取结构体指针。

用例是sync.Map,其中将包含锁的结构放入映射中,并使用Load()方法可以读取interface {}值。我想获得指向原始结构的指针,所以我不复制锁。

另一种方法是向Map添加一个指向该结构的指针,然后将其读回并将interface {}转换为该结构指针,但我很好奇是否可以实现第一种情况。

1 个答案:

答案 0 :(得分:2)

您不能那样做。如果在接口中“包装”非指针值,则只能使用type assertiontype switch从其中获取非指针值。而且由于类型断言表达式不是addressable,因此无法获取包装在接口中的“值”的地址。

如果仅在接口中包装了一个值,则将无法获得指向包装在接口中的原始值的指针。为什么?因为包装在接口中的值只能是一个副本,所以与原始版本完全分开。在此处查看示例和说明:How can a slice contain itself?

请注意,即使您包装了非指针值,实际上包装的值也可能不是指针(取决于值的大小),但这是实现细节,对您而言是隐藏的。当您提取值时,您当然会得到一个非指针。

相关问题