Refleksi: Mengakses Structs by String
Pertimbangkan senario di mana anda mempunyai struct dengan kaedah tertentu:
type MyStruct struct { } func (a *MyStruct) AAction() { fmt.Println("Hello a") }
Untuk menggunakan kaedah AAction secara dinamik menggunakan refleksi, anda boleh melakukan perkara berikut (sah pendekatan):
reflect.New(reflect.TypeOf(MyStruct{})).MethodByName("AAction").Call([]reflect.Value{})
Walau bagaimanapun, menggunakan MyStruct{} sebagai ungkapan bukanlah pendekatan yang anda inginkan. Sebaliknya, anda ingin menentukan nama struct sebagai rentetan. Pendekatan ini tidak boleh diakses pada masa ini:
theStruct := "MyStruct" theAction := "AAction" reflect.New(reflect.TypeOf(theStruct)).MethodByName(theAction).Call([]reflect.Value{})
Malangnya, percubaan ini cacat kerana reflect.TypeOf(theStruct) akan menghasilkan rentetan jenis.
Berdasarkan penyelidikan anda, anda mengalami perkara yang serupa soalan mengenai menggunakan kaedah struct dengan nama menggunakan rentetan. Walau bagaimanapun, pendekatan padanan rentetan yang dicadangkan bukanlah penyelesaian yang berdaya maju.
Jawapan:
Walaupun aspirasi anda, adalah tidak mungkin untuk memohon kaedah struct menggunakan hanya rentetan yang mewakili nama struct. Ini adalah benar kerana pantulan memerlukan nilai konkrit jenis yang dipersoalkan untuk beroperasi. Tanpa nilai, tiada cara untuk berinteraksi dengan struct atau kaedahnya.
Untuk mencapai kefungsian yang anda inginkan, anda perlu mengekalkan pendaftaran tersuai yang memetakan nama struct kepada jenis yang sepadan. Pendaftaran ini akan membolehkan anda mendapatkan semula jenis berdasarkan nama rentetan dan kemudian menggunakan refleksi seperti biasa. Walau bagaimanapun, pendekatan ini memerlukan usaha tambahan dan mungkin tidak sesuai dalam semua senario.
Atas ialah kandungan terperinci Bolehkah Anda Menggunakan Kaedah Struct dalam Go Menggunakan Hanya Nama Rentetannya Melalui Refleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!