Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah `reflect.Type` dan `reflect.Value` berbeza dalam pantulan Go, dan apakah cerapan yang mereka berikan tentang elemen program semasa masa jalan?

Bagaimanakah `reflect.Type` dan `reflect.Value` berbeza dalam pantulan Go, dan apakah cerapan yang mereka berikan tentang elemen program semasa masa jalan?

Patricia Arquette
Patricia Arquetteasal
2024-10-28 08:28:02520semak imbas

How do `reflect.Type` and `reflect.Value` differ in Go reflection, and what insights do they provide about program elements at runtime?

Memahami Jenis, Nilai dan Refleksi dalam Go

Dalam Go, refleksi menyediakan mekanisme untuk memeriksa dan memanipulasi kod pada masa jalan. Ia menawarkan dua jenis asas: reflect.Type dan reflect.Value, setiap satu menyediakan keupayaan berbeza untuk berinteraksi dengan elemen program.

Pertimbangkan coretan kod berikut:

<code class="go">func show(i interface{}) {
    switch t := i.(type) {
    case *Person:
        t := reflect.TypeOf(i)  // What does 't' contain?
        v := reflect.ValueOf(i) // What does 'v' contain?
        tag := t.Elem().Field(0).Tag
        name := v.Elem().Field(0).String()
    }
}</code>

Perbezaan Antara Jenis dan Nilai dalam Refleksi

  • refleksi.Jenis:

    • Mewakili jenis sebenar data, termasuk strukturnya , kaedah dan medan.
    • Membolehkan anda menanyakan maklumat khusus jenis, seperti nama medan, teg dan jenis asas.
    • Dalam contoh di atas, t = reflect.TypeOf(i ) mengembalikan jenis nilai i sebagai *reflect.Type.
  • refleksi.Nilai:

    • Mewakili nilai data sebenar, bersama-sama dengan jenisnya.
    • Membolehkan anda melakukan operasi pada nilai, seperti mendapatkan dan menetapkan medan, kaedah panggilan dan menukar kepada jenis lain.
    • Dalam contoh , v = reflect.ValueOf(i) mengembalikan *reflect.Nilai untuk nilai i. v.Elem().Field(0).String() mengekstrak nilai medan pertama sebagai rentetan.

Contoh Penggunaan

Dalam coretan kod yang disediakan, pernyataan suis menyemak sama ada i ialah tika "*Orang". Jika ya, reflect.TypeOf(i) mengembalikan jenis struct Person, membenarkan akses kepada teg medannya (cth., t.Elem().Field(0).Tag`).

Sementara itu, reflect.ValueOf(i) mengembalikan *reflect.Value for the Person. Dengan memanggil v.Elem().Field(0).String(), anda mendapatkan semula perwakilan rentetan bagi nilai medan pertamanya, tanpa mengira jenis kejadian tertentu.

Atas ialah kandungan terperinci Bagaimanakah `reflect.Type` dan `reflect.Value` berbeza dalam pantulan Go, dan apakah cerapan yang mereka berikan tentang elemen program semasa masa jalan?. 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