【问题标题】:storing and retrieving byte representation of interface存储和检索接口的字节表示
【发布时间】:2013-02-25 06:09:46
【问题描述】:

我需要存储和检索 interface{} 值的字节表示。为了澄清,我不是要存储打包到一个切片中的基础值,无论它们的大小是多少,而是寻找一种方法来存储指向所述值的指针。

我不能只使用type MyType interface{}; var arr []MyType 的原因是因为我在这个数组中打包了非均匀数量的其他字节。

为了实现这一点,我正在查看 reflect 和 unsafe 包,我看到像 UnsafeAddr 这样的方法返回一个指针。我可以使用存储该指针,然后稍后将其解码回我的 interface{} 值吗?

我看到的另一个函数是InterfaceData,它返回一个 2 字节的数组表示,但有什么办法可以再次将其转换回接口值?

我的高级目标是这样的:

// store the pointer to dataIn in the slice b
func putPtr(b []byte, dataIn interface{}) { ... }

// return the pointed to interface value from within b
func getInter(b []byte) interface{} { ... }

【问题讨论】:

  • 如何将字节转换为 interface{} 之前的?

标签: go byte slice


【解决方案1】:

无论您有什么原因,它都保证在一般情况下不起作用。一旦你从垃圾收集器 (GC) 意识中隐藏了一个指针,然后通过任何可能的技巧重新实现它,它(指针)可能不再有效。这是 GC 工作的全部原理。

要绕过此故障,必须保持指针对其他地方的 GC 可见,它必须保持可访问,以便 GC 不会在任何(不可预测的)时刻收集它。

但是,如果一个指针具有正常且可访问的表示形式,那么首先确实不需要任何其他(例如以 [] 字节编码)表示形式

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2013-11-28
    相关资源
    最近更新 更多