1 回答
TA贡献2021条经验 获得超8个赞
interface{}有自己的结构:
type eface struct {
typ *rtype
val unsafe.Pointer
}
rtype另一方面,您无法直接或通过链接访问,即使您将复制整个 rtype,它也可能在将来被更改(不推荐使用)。
但问题是,您可以将指针类型替换为unsafe.Pointer(它可以是具有相同大小的其他任何类型,但指针很惯用,因为每种类型都有自己的指针):
type eface struct {
typ, val unsafe.Pointer
}
所以,现在我们可以获取 eface 中包含的值:
func some_func(arg interface{}) {
passed_value := (*eface)(unsafe.Pointer(&arg)).val
*(*byte)(passed_value) = 'b'
}
some_var := byte('a')
fmt.Println(string(some_var)) // 'a'
some_func(some_var)
fmt.Println(string(some_var)) // 'a', it didn't changed, just because it was copied
some_func(&some_var)
fmt.Println(string(some_var)) // 'b'
您还可能在我的存储库中看到更多用法: https://github.com/LaevusDexter/fast-cast
抱歉我的英语不好。
- 1 回答
- 0 关注
- 63 浏览
添加回答
举报