首頁 >後端開發 >Golang >為什麼反射無法取得Go方法參數名稱?

為什麼反射無法取得Go方法參數名稱?

Susan Sarandon
Susan Sarandon原創
2024-12-22 08:37:09977瀏覽

Why Can't I Get the Name of a Go Method Parameter Using Reflection?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn