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 關注
- 89 瀏覽
添加回答
舉報