Rumah pembangunan bahagian belakang Golang Bagaimana untuk mencipta jenis tersuai dinamik menggunakan pantulan Golang?

Bagaimana untuk mencipta jenis tersuai dinamik menggunakan pantulan Golang?

Jun 02, 2024 pm 08:24 PM
refleksi jenis dinamik

Bagaimana untuk mencipta jenis tersuai dinamik menggunakan pantulan Go? Buat jenis tersuai: Gunakan kata kunci jenis untuk menentukan struktur. Dapatkan jenis pantulan: Dapatkan jenis pantulan melalui fungsi reflect.TypeOf(). Cipta jenis dinamik: Gunakan fungsi reflect.New untuk mencipta penunjuk kepada jenis tersuai. Tetapkan nilai: Gunakan fungsi v.Elem() dan reflect.Set() untuk menetapkan nilai. Dapatkan nilai: Gunakan kaedah Antaramuka() untuk mendapatkan nilai antara muka nilai tersebut.

如何使用 Golang 反射创建动态自定义类型?

Cara mencipta jenis tersuai dinamik menggunakan pantulan Go

Refleksi ialah ciri berkuasa dalam Go yang membolehkan program memeriksa dan mengubah suai kodnya sendiri. Dengan refleksi, kami boleh mencipta jenis tersuai dinamik yang boleh diubah suai pada masa jalan seperti yang diperlukan.

Buat jenis tersuai

Untuk mencipta jenis tersuai, kita boleh menggunakan type Kata kunci: type 关键字:

type person struct {
    name string
    age  int
}
Salin selepas log masuk

反射类型

要获取一个类型的反射类型,可以使用 reflect.TypeOf() 函数:

t := reflect.TypeOf(person{})
Salin selepas log masuk

创建动态类型

要创建动态类型,我们可以使用 reflect.New 函数以指定反射类型作为参数:

v := reflect.New(t)
Salin selepas log masuk

v 变量现在代表了一个指向自定义类型的指针。我们现在可以使用反射来设置和获取值:

设置值

可以使用 v.Elem() 获取指针指向的值,然后使用标准方法或 reflect.Set 函数设置值:

v.Elem().FieldByName("name").SetString("John")
v.Elem().FieldByName("age").SetInt(30)
Salin selepas log masuk

获取值

使用 reflect.Value 类型的 Interface 方法可以获取值的接口值:

name := v.Elem().FieldByName("name").Interface()
age := v.Elem().FieldByName("age").Interface()
Salin selepas log masuk

实战案例

假设我们有一个 JSON 字符串,其中包含一个人的姓名和年龄:

{
  "name": "Jane",
  "age": 35
}
Salin selepas log masuk

我们可以使用反射来动态创建 person

import (
    "encoding/json"
    "fmt"
    "reflect"
)

func main() {
    // 反射创建自定义类型
    t := reflect.TypeOf(person{})
    v := reflect.New(t)

    // 反射解组 JSON 字符串
    var data map[string]interface{}
    err := json.Unmarshal([]byte(`{
        "name": "Jane",
        "age": 35
    }`), &data)
    if err != nil {
        panic(err)
    }

    // 反射设置字段值
    for k, v := range data {
        v.Elem().FieldByName(k).Set(reflect.ValueOf(v))
    }

    // 反射获取字段值
    fmt.Println(v.Elem().FieldByName("name").Interface()) // 输出:"Jane"
    fmt.Println(v.Elem().FieldByName("age").Interface())  // 输出:35
}
type person struct {
    name string
    age  int
}
Salin selepas log masuk
🎜Jenis reflektif🎜🎜🎜Untuk mendapatkan jenis reflektif, kita boleh menggunakan reflect.TypeOf() fungsi: 🎜rrreee🎜🎜Mencipta jenis dinamik 🎜🎜🎜Untuk mencipta jenis dinamik, kita boleh menggunakan fungsi reflect.New dengan jenis pantulan yang ditentukan sebagai parameter: 🎜 rrreee🎜Pembolehubah v kini mewakili penuding kepada jenis tersuai. Kini kita boleh menggunakan refleksi untuk menetapkan dan mendapatkan nilai: 🎜🎜🎜Tetapkan nilai 🎜🎜🎜 Anda boleh menggunakan v.Elem() untuk mendapatkan nilai yang ditunjuk oleh penunjuk, kemudian gunakan kaedah standard atau reflect.Set Fungsi untuk menetapkan nilai: 🎜rrreee🎜🎜Dapatkan nilai 🎜🎜🎜Gunakan kaedah Antaramuka reflect.Value taip untuk mendapatkan nilai antara muka nilai: 🎜rrreee🎜🎜 Kes praktikal 🎜🎜🎜Andaikan kita mempunyai rentetan JSON yang mengandungi nama dan umur seseorang: 🎜rrreee🎜Kita boleh menggunakan refleksi untuk mencipta orangsecara dinamik > taip dan tetapkan nilainya: 🎜rrreee

Atas ialah kandungan terperinci Bagaimana untuk mencipta jenis tersuai dinamik menggunakan pantulan Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial Java
1662
14
Tutorial PHP
1262
29
Tutorial C#
1235
24
Pelaksanaan mekanisme refleksi antara muka dan kelas abstrak di Jawa Pelaksanaan mekanisme refleksi antara muka dan kelas abstrak di Jawa May 02, 2024 pm 05:18 PM

Mekanisme pantulan membenarkan atur cara untuk mendapatkan dan mengubah suai maklumat kelas semasa runtime Ia boleh digunakan untuk melaksanakan refleksi antara muka dan kelas abstrak: Refleksi antara muka: mendapatkan objek pantulan antara muka melalui Class.forName() dan mengakses metadatanya (nama, kaedah dan. padang). Refleksi kelas abstrak: Sama seperti antara muka, anda boleh mendapatkan objek pantulan kelas abstrak dan mengakses metadata dan kaedah bukan abstraknya. Kes praktikal: Mekanisme pantulan boleh digunakan untuk melaksanakan proksi dinamik dan memintas panggilan ke kaedah antara muka pada masa jalan dengan mencipta kelas proksi secara dinamik.

Cara menggunakan refleksi untuk mengakses medan dan kaedah persendirian dalam golang Cara menggunakan refleksi untuk mengakses medan dan kaedah persendirian dalam golang May 03, 2024 pm 12:15 PM

Anda boleh menggunakan refleksi untuk mengakses medan dan kaedah peribadi dalam bahasa Go: Untuk mengakses medan peribadi: dapatkan nilai pantulan nilai melalui reflect.ValueOf(), kemudian gunakan FieldByName() untuk mendapatkan nilai pantulan medan dan panggil Kaedah String() untuk mencetak nilai medan . Panggil kaedah persendirian: dapatkan juga nilai pantulan nilai melalui reflect.ValueOf(), kemudian gunakan MethodByName() untuk mendapatkan nilai pantulan kaedah, dan akhirnya panggil kaedah Call() untuk melaksanakan kaedah. Kes praktikal: Ubah suai nilai medan persendirian dan panggil kaedah persendirian melalui refleksi untuk mencapai kawalan objek dan liputan ujian unit.

Menjelaskan mengapa Python ialah bahasa yang ditafsirkan Menjelaskan mengapa Python ialah bahasa yang ditafsirkan Sep 17, 2023 pm 10:41 PM

Python ialah bahasa pengaturcaraan peringkat tinggi yang ditafsirkan tujuan umum, interaktif, berorientasikan objek. Python diproses oleh penterjemah semasa runtime. Tidak perlu menyusun atur cara sebelum melaksanakannya. Ini serupa dengan PERL dan PHP. Langkah-Langkah Pelaksanaan Langkah1 - Kod sumber Python ditulis oleh pengekod. Sambungan fail: .py Langkah 2 - Kod sumber Python yang ditulis oleh pengekod disusun ke dalam kod bait Python. Semasa proses ini, fail dengan sambungan .pyc akan dibuat. Langkah 3 - Mesin maya melaksanakan fail sambungan .pyc. Pertimbangkan mesin maya sebagai enjin runtime Python. Di sinilah program Python dijalankan. Oleh itu, jurubahasa Python termasuk proses penyusunan atur cara, dan atur cara disusun sebagai

Pertimbangan keselamatan dan penyelesaian terbaik untuk refleksi golang Pertimbangan keselamatan dan penyelesaian terbaik untuk refleksi golang May 04, 2024 pm 04:48 PM

Reflection menyediakan keupayaan menyemak jenis dan pengubahsuaian dalam Go, tetapi ia mempunyai risiko keselamatan, termasuk pelaksanaan kod sewenang-wenangnya, pemalsuan jenis dan kebocoran data. Amalan terbaik termasuk mengehadkan kebenaran reflektif, operasi, menggunakan senarai putih atau senarai hitam, mengesahkan input dan menggunakan alat keselamatan. Dalam amalan, refleksi boleh digunakan dengan selamat untuk memeriksa maklumat jenis.

Cara menggunakan pantulan untuk mengubah suai nilai pembolehubah secara dinamik dalam golang Cara menggunakan pantulan untuk mengubah suai nilai pembolehubah secara dinamik dalam golang May 02, 2024 am 11:09 AM

Refleksi bahasa Go membolehkan anda memanipulasi nilai pembolehubah pada masa jalan, termasuk mengubah suai nilai Boolean, integer, nombor titik terapung dan rentetan. Dengan mendapatkan Nilai pembolehubah, anda boleh memanggil kaedah SetBool, SetInt, SetFloat dan SetString untuk mengubah suainya. Sebagai contoh, anda boleh menghuraikan rentetan JSON ke dalam struktur dan kemudian menggunakan refleksi untuk mengubah suai nilai medan struktur. Perlu diingatkan bahawa operasi pantulan adalah perlahan dan medan yang tidak boleh diubah suai tidak boleh diubah suai Apabila mengubah nilai medan struktur, medan yang berkaitan mungkin tidak dikemas kini secara automatik.

Fungsi Golang menggunakan refleksi untuk melaksanakan pengaturcaraan berorientasikan aspek Fungsi Golang menggunakan refleksi untuk melaksanakan pengaturcaraan berorientasikan aspek Apr 25, 2024 pm 05:48 PM

Jawapan: Ya, refleksi dalam bahasa Go boleh melaksanakan pengaturcaraan berorientasikan aspek. Penerangan terperinci: Refleksi membenarkan atur cara mengubah suai dan memeriksa jenis dan nilainya sendiri semasa masa jalan. Melalui refleksi, kita boleh mencipta aspek global untuk kod, yang dicetuskan sebelum dan selepas fungsi itu dilaksanakan. Ini membolehkan kami dengan mudah menambah fungsi seperti pengelogan tanpa mengubah suai kod sedia ada. Reflection memberikan kelebihan penyahgandingan kod, kebolehskalaan dan kawalan fleksibel, dengan itu meningkatkan kebolehselenggaraan dan kebolehgunaan semula aplikasi.

Bagaimanakah mekanisme pantulan Java melaksanakan pemuatan dinamik kelas? Bagaimanakah mekanisme pantulan Java melaksanakan pemuatan dinamik kelas? May 04, 2024 pm 03:42 PM

Mekanisme pantulan Java membenarkan kelas dimuatkan secara dinamik dan digunakan semasa masa jalan, dan metadata kelas boleh dimanipulasi melalui kelas dalam pakej java.lang.reflect, termasuk Kelas, Kaedah dan Medan. Melalui kes praktikal memuatkan kelas Contoh, menginstant objek, mendapatkan dan memanggil kaedah, anda boleh menunjukkan aplikasinya dalam kelas yang dimuatkan secara dinamik, dengan itu menyelesaikan masalah pengaturcaraan dan meningkatkan fleksibiliti.

Cahaya Terpantul: Meneroka Kaedah Panggilan Dinamik dalam Bahasa Go Cahaya Terpantul: Meneroka Kaedah Panggilan Dinamik dalam Bahasa Go Apr 08, 2024 am 10:00 AM

Refleksi ialah alat yang berkuasa dalam bahasa Go yang membolehkan program memanggil kaedah secara dinamik. Langkah khusus termasuk: Dapatkan metadata kaedah (reflect.Method) Dapatkan jenis kaedah (reflect.Value) Gunakan jenis kaedah untuk memanggil kaedah secara dinamik (reflect.Func.Call) Refleksi boleh digunakan untuk penjadualan kaedah dinamik, ujian unit dan penjanaan kod. Walau bagaimanapun, memandangkan refleksi beroperasi dengan perlahan, ia harus digunakan dengan berhati-hati dan berhati-hati untuk memeriksa jenis.

See all articles