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

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

如何在golang中使用接口反射的類型斷言?

如何在golang中使用接口反射的類型斷言?

Go
HUH函數 2022-05-10 16:12:01
我正在嘗試在 golang 中使用類型斷言。直接斷言沒有問題。a, ok := i.(MyStruct)但是當我使用反射時b, ok := i.(reflect.TypeOf(i))我有一個錯誤。那有什么問題?以及如何處理?完整代碼:package mainimport (     "fmt"     "reflect")type MyStruct struct {    field string}func main() {    var i interface{} = MyStruct{field:"Thanks"}    a, ok := i.(MyStruct)    fmt.Println(a, ok)    t := reflect.TypeOf(i)    fmt.Println(t)    b, ok := i.(t)    fmt.Println(b, ok)}感謝您的回答。
查看完整描述

1 回答

?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

很多事情,但基本上“它不是那樣工作的”。類型斷言中括號內的內容必須是類型,即類型名稱或類型文字。reflect.TypeOf(i)不是其中之一,它是一個方法調用表達式。因此這是一個語法錯誤。reflect.TypeOf不“返回類型”(這在 Go 中實際上不是你可以做的事情),它返回一個reflect.Type,它是一個普通的 go 結構,包含有關類型的信息(即某種元類型)。

但它不起作用的更根本原因是因為它不能...... Go 需要知道變量在聲明時的類型是什么。它的類型要么在聲明中明確給出,要么從聲明或短賦值var中的初始化值類型推斷出來。在編譯時類型是未知的是不可能的。Go 不允許您編寫產生未確定類型的表達式。var x = valuex := value

類型斷言的真正目的是獲取接口類型的值(它是一種“盒子”,可以保存多種類型的值,或者 for interface{},任何類型的值)并檢索特定具體類型的值. 斷言產生的值將具有斷言命名的類型,沒有其他類型。(在,ok賦值的情況下,如果斷言失敗,變量將保持零值但仍然是正確的類型)。如果您可以將斷言寫入僅在運行時才知道的類型,那么整個事情就會崩潰,所以您不能編寫它——這是一個錯誤。

簡而言之,您不能使用反射來做到這一點。您可以使用反射來了解類型i是什么,您可以了解該類型的名稱,您可以了解它的底層Kind是 Struct,您可以枚舉結構的字段并從中獲取值等等......所有這些是反射的合法用途。但它不能給你一個類型的變量MyStruct——這樣做的方法是i.(MyStruct).


查看完整回答
反對 回復 2022-05-10
  • 1 回答
  • 0 關注
  • 197 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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