Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mari kita bercakap tentang pengetahuan refleksi Golang

Mari kita bercakap tentang pengetahuan refleksi Golang

PHPz
PHPzasal
2023-04-11 09:16:28532semak imbas

Bahasa Go ialah bahasa pengaturcaraan yang dilancarkan oleh Google Ia mempunyai ciri-ciri keselarasan, kecekapan dan kebolehselenggaraan, dan digunakan secara meluas dalam bidang Internet moden. Refleksi ialah konsep yang sangat penting dalam bahasa Go, yang membolehkan program memeriksa dan mengubah suai nilai, jenis dan sifat pembolehubah semasa masa jalan. Dalam artikel ini, kami akan memberi tumpuan kepada memperkenalkan pengetahuan tentang refleksi Golang.

1. Apakah refleksi

Refleksi merujuk kepada memperoleh jenis, nilai dan kaedah pembolehubah secara dinamik semasa program berjalan, dan boleh dipanggil dan diubah suai secara dinamik pada masa jalan. Dalam bahasa Go, setiap pembolehubah mempunyai jenis dan nilai statik, dan mekanisme pantulan membenarkan atur cara mendapatkan maklumat ini pada masa jalan dan menggunakan maklumat ini untuk melaksanakan operasi yang diperlukan.

2. Penggunaan pantulan

Dalam bahasa Go, penggunaan pantulan adalah sangat meluas Contohnya: dalam pensirilan dan penyahserikan JSON, objek perlu disirikan ke dalam rentetan JSON atau Deserialize. Rentetan JSON ke dalam objek; dalam rangka kerja ORM, objek perlu dipetakan ke struktur jadual dalam pangkalan data hubungan dalam rangka kerja RPC, kaedah pemeriksaan dan panggilan dinamik diperlukan, dsb.

Dalam bahasa Go, perkara paling penting untuk menggunakan refleksi adalah untuk mendapatkan maklumat jenis dan maklumat nilai. Menggunakan jenis Jenis dan jenis Nilai yang disediakan dalam perpustakaan pantulan, anda boleh mendapatkan maklumat jenis dan nilai pembolehubah.

3. Jenis Refleksi

Jenis Jenis dalam perpustakaan pantulan mewakili maklumat jenis pembolehubah, yang boleh diperoleh melalui reflect.TypeOf(). Secara amnya, jenis Jenis ialah jenis antara muka, yang mengandungi maklumat seperti jenis asas pembolehubah, laluan pakej dan sama ada ia jenis penunjuk. Jenis jenis mempunyai kaedah yang biasa digunakan berikut:

  1. Nama() rentetan: Mengembalikan nama jenis.
  2. String() string: Perwakilan rentetan jenis pulangan, secara amnya sama dengan nilai pulangan kaedah Name().
  3. PkgPath() rentetan: Jika jenis ditakrifkan dalam pakej, mengembalikan laluan pakej, jika tidak mengembalikan rentetan kosong.
  4. Kind() reflect.Kind: Mengembalikan klasifikasi jenis pendasar, iaitu jenis khusus pembolehubah.

Jenis reflect.Kind dalam perpustakaan pantulan mewakili klasifikasi jenis asas, yang mengandungi maklumat seperti jenis asas, jenis komposit dan jenis antara muka Terdapat klasifikasi yang biasa digunakan berikut:

  1. reflect.Int
  2. refleksi.String
  3. refleksi.Bool
  4. refleksi.Array
  5. refleksi.Slice
  6. refleksi.Struktur
  7. refleksi.Antaramuka

Kod sampel:

type Person struct {
    Name string
    Age  int
}

func main() {
    var name string = "Tom"
    var age int = 18
    var p Person = Person{"Mike", 25}

    fmt.Println(reflect.TypeOf(name).Name(), reflect.TypeOf(name).Kind()) // string string
    fmt.Println(reflect.TypeOf(age).Name(), reflect.TypeOf(age).Kind())   // int int
    fmt.Println(reflect.TypeOf(p).Name(), reflect.TypeOf(p).Kind())       // Person struct
}

4. Jenis Nilai Refleksi

Jenis Nilai dalam pustaka refleksi digunakan untuk mendapatkan Maklumat nilai pembolehubah boleh diperolehi melalui reflect.ValueOf(). Jenis Nilai juga merupakan jenis antara muka, termasuk kaedah untuk mendapatkan dan menetapkan nilai pembolehubah, maklumat jenis pembolehubah, dan kaedah untuk beroperasi pada pembolehubah. Jenis Nilai mempunyai kaedah yang biasa digunakan berikut:

  1. Jenis() mencerminkan.Jenis: Mengembalikan klasifikasi jenis tertentu bagi nilai.
  2. String() string: Mengembalikan perwakilan rentetan nilai.
  3. Antara muka() antara muka{}: Jenis antara muka nilai pulangan.
  4. Type() reflect.Type: Mengembalikan maklumat jenis nilai.
  5. CanSet() bool: Mengembalikan sama ada ia boleh ditetapkan.
  6. Set(): Tetapkan nilai kepada pembolehubah.

Kod contoh:

var name string = "Tom"
var age int = 18
fmt.Println(reflect.ValueOf(name).String()) // Tom
fmt.Println(reflect.ValueOf(age).Int())     // 18

5 Kaedah Refleksi

Pustaka refleksi juga menyediakan kaedah yang serupa dengan kaedah panggilan Call(), yang boleh digunakan Panggil secara dinamik mana-mana kaedah dengan tandatangan yang diketahui, di mana tandatangan menentukan nama kaedah, jenis parameter dan jenis nilai pulangan. Apabila memanggil kaedah, anda perlu menyediakan objek kaedah dan satu set nilai parameter Pustaka pantulan akan memanggil kaedah yang sepadan secara dinamik berdasarkan tandatangan kaedah dan senarai parameter yang diluluskan.

Kod sampel:

type Person struct {
    Name string
    Age  int
}

func (p Person) SayHello() {
    fmt.Printf("Hello, I'm %s, age %d.\n", p.Name, p.Age)
}

func main() {
    var p Person = Person{"Mike", 25}
    v := reflect.ValueOf(p)
    m := v.MethodByName("SayHello")
    m.Call(nil)
}

6 Had pantulan

Walaupun perpustakaan pantulan menyediakan banyak kaedah untuk mendapatkan dan mengubah suai maklumat berubah secara dinamik, operasi pantulan Beberapa. pengecualian mungkin dilemparkan semasa proses, seperti: jenis pembolehubah tidak menyokong kaedah tertentu, mengakses medan yang tidak didedahkan, penukaran jenis haram, dsb. Di samping itu, mekanisme pantulan juga akan membawa kepada penurunan dalam kecekapan menjalankan program, kerana apabila memperoleh dan mengubah suai maklumat berubah secara dinamik, beberapa operasi tambahan seperti penukaran jenis, peruntukan memori, dan panggilan kaedah diperlukan, yang mempunyai kesan negatif terhadap prestasi program.

7. Ringkasan

Refleksi merupakan konsep yang sangat penting dalam bahasa Go Melalui mekanisme refleksi, maklumat seperti jenis, nilai dan atribut pembolehubah boleh diperolehi dan diubah suai semasa runtime . Dalam pengaturcaraan sebenar, kita boleh menggunakan mekanisme pantulan untuk melaksanakan beberapa ciri lanjutan, seperti mencipta objek secara dinamik, mengakses medan yang tidak didedahkan, kaedah panggilan secara dinamik, dsb. Walau bagaimanapun, anda perlu memberi perhatian kepada beberapa batasan apabila menggunakan mekanisme pantulan, dan cuba mengelakkan kemerosotan prestasi sambil memastikan ketepatan program.

Atas ialah kandungan terperinci Mari kita bercakap tentang pengetahuan refleksi Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn