2015-07-13 57 views
3

方法的參數名稱鑑​​於以下轉到方法:獲得在Golang

func (t *T) TMethod(data *testData) (interface{}, *error) { 
    ... 
} 

我想反映的參數的名稱(這是data這裏)。

我嘗試以下,但它返回結構名(這是testData這裏):

reflect.ValueOf(T).MethodByName("TMethod").Type().In(0).Elem().Name() 

我怎樣才能獲得參數的名稱?

+0

您沒有嘗試該代碼,因爲它沒有編譯。 – rightfold

+0

@ rightfold:我試了一下,只是增加了更多的細節。 – Mohsen

回答

9

無法獲取方法或函數的參數名稱。

原因是因爲名稱對於調用方法或函數的人來說並不重要。重要的是參數的類型和順序。

A Function type表示具有相同參數和結果類型的所有函數的集合。無論參數的名稱如何,具有相同參數和結果類型的2個函數的類型都是相同的。下面的代碼打印true

func f1(a int) {} 
func f2(b int) {} 

fmt.Println(reflect.TypeOf(f1) == reflect.TypeOf(f2)) 

甚至可以創建一個函數或方法,你甚至不給參數給出名字(參數或結果的列表中,名單,必須悉數到場或全部不存在)。這是有效的代碼:

func NamelessParams(int, string) { 
    fmt.Println("NamelessParams called") 
} 

如果你想創建某種框架,你打電話值傳遞函數來「命名」參數(例如映射進來的API PARAMS到去功能/法PARAMS),你可以使用struct,因爲使用reflect包可以獲得命名字段(例如Value.FieldByName()Type.FieldByName()),或者您可以使用map。看到這個相關的問題:Initialize function fields

這是一個關於golang-nuts mailing list的相關討論。