亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Go 中獲取指向 Interface{} 底層值的指針

如何在 Go 中獲取指向 Interface{} 底層值的指針

Go
泛舟湖上清波郎朗 2023-07-17 15:15:53
我使用 cgo 與 Go 中的 C 代碼交互,并且需要使用指向對象中基礎值的指針來調用 C 函數Interface{}。該值將是任何原子基元類型(不包括complex64/?complex128)或string。我希望我能夠做這樣的事情來獲取ptr以下地址unsafe.Pointer:unsafe.Pointer(reflect.ValueOf(ptr).UnsafeAddr())但這會導致恐慌,因為該值無法尋址。已知該值將始終是上面指定的類型之一(最多為 64 位),并且我只需要將這個值賦予 C 函數即可。請注意,有多個 C 函數,并且將根據不同的不相關參數調用不同的函數。我還嘗試使用類型 switch 語句來解決這個問題,但是我發現即使在類型斷言完成之后我也無法獲取值的地址。我能夠將值分配給臨時副本,然后獲取這些副本的地址,但如果可能的話,我寧愿避免制作這些副本。
查看完整描述

1 回答

?
寶慕林4294392

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


抱歉我的英語不好。


查看完整回答
反對 回復 2023-07-17
  • 1 回答
  • 0 關注
  • 89 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號