Dalam percubaan untuk membina sistem templat yang mesra pengguna, persoalan timbul: bagaimana nama pembolehubah boleh diperolehi seperti yang ditunjukkan dalam kod sumber menggunakan pantulan?
Matlamatnya adalah untuk mencipta sekeping pembolehubah (rentetan) dan berulang melaluinya, menggantikan markup {{}} ruang letak dengan nilai pembolehubah sebenar. Contohnya, jika nama pembolehubah ialah onevar, sistem harus mengimbas templat untuk {{onevar}} dan menggantikannya dengan nilai pembolehubah.
Tugas ini melibatkan pemahaman sifat pantulan apabila berurusan dengan pembolehubah. Dalam coretan kod yang disediakan:
onevar := "something" other := "something else" var msg string sa := []string{onevar, other} for _, v := range sa { vName := reflect.TypeOf(v).Name() vName = fmt.Sprintf("{{%s}}", vName) msg = strings.Replace(msg, vName, v, -1) }
Kod cuba mendapatkan semula nama pembolehubah dengan menggunakan pantulan:
vName := reflect.TypeOf(v).Name()
Walau bagaimanapun, pendekatan ini tidak berjaya kerana kepingan mengandungi nilai, bukan pembolehubah . Oleh itu, mendapatkan nama pembolehubah daripada kepingan terbukti mustahil.
Penyelesaian:
Untuk menangani isu ini, pertimbangkan untuk menggunakan peta dan bukannya kepingan, sebagai kunci bersekutu peta (nama pembolehubah ) dengan nilai:
vars := map[string]string{ "onevar": "something", "other": "something else", } var msg string for name, value := range vars { vName := fmt.Sprintf("{{%s}}", name) msg = strings.Replace(msg, vName, value, -1) }
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Dapatkan Nama Pembolehubah daripada Kod Sumber Menggunakan Refleksi untuk Templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!