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

Patricia Arquette
Lepaskan: 2024-10-28 08:28:02
asal
525 orang telah melayarinya

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!