Getting the Name of a Method Parameter
When working with Go methods, it may be desirable to obtain the name of a 特定參數。例如, 對於以下方法:
func (t *T) TMethod(data *testData) (interface{}, *error) { ... }
想要取得參數 data 的名稱。然而,使用下列反射程式碼會傳回結構名稱 testData:
reflect.ValueOf(T).MethodByName("TMethod").Type.In(0).Elem().Name()
為什麼無法取得參數名稱?
實際上,在 Go 語言中,無法取得函數或方法參數的名稱。這是因為,對於呼叫方而言,參數的名稱並不重要。重要的只有參數的型別和順序。
函數類型表示具有相同參數和結果類型的所有函數的集合。如果兩個函數具有相同參數和結果類型,則其類型相同,而不管參數的名稱如何。以下程式碼會列印 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 參數到Go 函數/方法參數的命名參數框架,可以使用結構體,因為使用reflect 套件可以取得命名欄位(例如Value.FieldByName() 和Type.FieldByName()),或可以使用映射。請參閱以下相關問題:
初始化函數欄位
有關詳細資訊和範例,請參閱Google 郵件清單的相關文章:
unnamed arguments 在Go 中是否為真實存在的?
以上是為什麼反射無法取得Go方法參數名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!