2015-10-13 19 views
-2

例如,我有一個名爲interface{}a,我也有一個reflect.Type稱爲elemType。現在,我要鍵入斷言到elemType,但a.(elemType)不能成功編譯。如何解決它?在golang中,如何輸入assert interface {}爲由reflect.Type指定的類型?

對不起,我的困惑表情。我的意思是,我從一個函數中獲得一個類型,並且我想要爲此類型鍵入一個接口{},但是此類型存儲在reflect.Type變量中。

我想要做的是類似下面的代碼:

var a interface{} 

//do something 

func getType() reflect.Type { 
    var ret reflect.Type 
    //do something 
    return ret 
} 

targetType := getType() 
result := a.(targetType) 
+4

elemType不是一個類型,它是一種變種,這就是爲什麼這種類型的說法不能工作。你可以對'reflect.Type'做一個類型斷言,但不知何故,我懷疑你想要做什麼。向我們展示一些代碼吧? – HectorJ

+1

Puh,empty'interface {}'_and_type assertion to'reflect.Type'!你確定你a)必須和b)應該像這樣解決你的問題嗎?有時候反思是做事情的最好方式,有時候空的界面是有幫助的,但兩者都不是解決問題最直接的方法。 – Volker

回答

1

考慮轉到一個標準型的斷言:

v := a.(typeName) 

這裏編譯器可以判斷變量v的類型編譯時間,並在編譯涉及變量的任何其他語句時利用這些知識。

以您在斷言中使用refltect.Type變量的示例爲例,不可能確定v的類型,因此無法編譯代碼。

如果您需要檢查一個特定的接口變量在運行時特定類型的,你仍然可以做到這一點與reflect包。例如:

// if elemType is a normal type 
if reflect.ValueOf(a).Type() == elemType { 
    fmt.Println("type matches") 
} 

// if elemType is an interface, can check if the value implements it 
if reflect.ValueOf(a).Type().Implements(elemType) { 
    fmt.Println("value implements interface") 
} 

但是您將需要一個具體類型返回到標準變量。如果你只有一小部分可能的類型選擇,也許使用類型開關可能會做你想要的。

相關問題