我需要存储和检索 interface{} 值的字节表示形式。澄清一下,我不是要将基础值存储到一个 slice 中,无论它们的大小是多少,而是寻找一种方法来存储指向所述值的指针。
我不能直接输入 type MyType interface{} 的原因; var arr []MyType
是因为我在这个数组中打包了不均匀数量的其他字节。
为了实现这个,我查看了 reflect 和 unsafe 包,我看到了像 UnsafeAddr
这样的方法,它返回一个指针。我可以使用存储该指针然后将其解码回我的接口(interface){}值吗?
我看到的另一个函数是 InterfaceData
,它返回一个 2 字节数组表示形式,但是有什么方法可以再次将其转换回接口(interface)值吗?
我的高级目标是:
// 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{} { ... }
最佳答案
无论出于何种原因,它在一般情况下都无法正常工作。一旦您从垃圾收集器 (GC) 的意识中隐藏了一个指针,然后通过任何可能的技巧将其重新生成,它(指针)可能不再有效。这是 GC 工作原理的全部原则。
要绕过此故障,必须使指针对别处的 GC 可见,它必须保持可达,以便 GC 在任何(不可预测的)时刻不收集它。
但是如果一个人有一个可用的指针的正常和可达的表示,那么首先就不需要任何其他的(比如在 []byte 中编码)表示
关于go - 存储和检索接口(interface)的字节表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15315329/