Mendapatkan Nama Parameter Kaedah
Apabila bekerja dengan kaedah Go, mungkin wajar untuk mendapatkan nama parameter tertentu. Contohnya, untuk kaedah berikut:
func (t *T) TMethod(data *testData) (interface{}, *error) { ... }
ingin mendapatkan nama data parameter. Walau bagaimanapun, menggunakan kod pantulan berikut mengembalikan nama struct testData:
reflect.ValueOf(T).MethodByName("TMethod").Type.In(0).Elem().Name()
Mengapa saya tidak boleh mendapatkan nama parameter?
Sebenarnya, dalam bahasa Go, tiada cara untuk mendapatkan nama fungsi atau parameter kaedah. Ini kerana, kepada pemanggil, nama parameter tidak penting. Yang penting hanyalah jenis dan susunan parameter.
Jenis fungsi mewakili koleksi semua fungsi dengan parameter dan jenis hasil yang sama. Jika dua fungsi mempunyai parameter dan jenis hasil yang sama, jenisnya adalah sama, tanpa mengira nama parameter. Kod berikut akan dicetak benar:
func f1(a int) {} func f2(b int) {} fmt.Println(reflect.TypeOf(f1) == reflect.TypeOf(f2))
Malah mungkin untuk mencipta fungsi atau kaedah yang tidak memberikan nama parameternya (sama ada semua atau tiada nama terdapat dalam senarai parameter atau hasil). Kod berikut berfungsi:
func NamelessParams(int, string) { fmt.Println("NamelessParams called") }
Penyelesaian
Jika anda ingin mencipta rangka kerja parameter bernama yang memetakan parameter API masuk ke parameter fungsi/kaedah Go, anda boleh Gunakan struct kerana anda boleh mendapatkan medan bernama menggunakan pakej reflect (seperti Value.FieldByName() dan Type.FieldByName()), atau anda boleh menggunakan peta. Lihat soalan berkaitan berikut:
Memulakan medan fungsi
Untuk butiran dan contoh, lihat artikel berkaitan pada senarai mel Google:
Adakah argumen yang tidak dinamakan benar dalam Go wujud?
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Mendapatkan Nama Parameter Kaedah Go Menggunakan Refleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!