reflect.Type dan reflect.Value
TypeOf, ValueOf, Kind dan Elem
reflect.Type dan reflect.Value ialah pelajaran Go Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Go Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Go Academy merangkumi sejumlah 4 pelajaran.
Gambaran keseluruhan pakej reflect
Pakej reflect membolehkan program Go memeriksa jenis dan nilai pada masa jalan. Pakej ini menjadi asas kepada pustaka pengekodan, ORM dan rangka kerja suntikan kebergantungan.
reflect.TypeOf
reflect.TypeOf(x) mengembalikan reflect.Type bagi nilai x:
t := reflect.TypeOf(42)
fmt.Println(t.Name()) // "int"
fmt.Println(t.Kind()) // "int"
fmt.Println(t.String()) // "int"reflect.ValueOf
reflect.ValueOf(x) mengembalikan reflect.Value yang mengandungi x. Anda boleh membaca nilai tersebut dengan kaedah khusus untuk Kind:
v := reflect.ValueOf(42)
fmt.Println(v.Kind()) // "int"
fmt.Println(v.Int()) // 42Type.Kind berbanding Type.Name
Kind ialah kategori asas Go (int, struct, ptr, slice, ...). Name ialah nama jenis yang diisytiharkan ("MyStruct"). Antara muka mempunyai Kind == Interface tetapi tiada Name.
Medan struct
Periksa medan struct melalui Type.NumField() dan Type.Field(i), yang mengembalikan reflect.StructField:
t := reflect.TypeOf(User{})
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
fmt.Printf("Field: %s Type: %s Tag: %s\n", f.Name, f.Type, f.Tag.Get("json"))
}Membaca nilai medan struct
Gunakan Value.FieldByName atau Value.Field(i) untuk membaca nilai medan semasa masa jalan:
v := reflect.ValueOf(user)
nameField := v.FieldByName("Name")
fmt.Println(nameField.String()) // "Alice"Menetapkan nilai medan struct
Untuk menetapkan medan, nilai tersebut mestilah boleh dialamatkan (dihantar sebagai penuding):
v := reflect.ValueOf(&user).Elem()
v.FieldByName("Name").SetString("Bob")Penyahrujukan penuding
Jika nilai ialah penuding, panggil v.Elem() untuk mendapatkan nilai yang ditunjuknya. Semak v.Kind() == reflect.Ptr dahulu.
if v.Kind() == reflect.Ptr {
v = v.Elem()
}reflect.New
Cipta nilai sifar baharu bagi sesuatu jenis dan dapatkan penuding kepadanya:
t := reflect.TypeOf(User{})
ptr := reflect.New(t) // *User
user := ptr.Interface().(*User)Memanggil kaedah
Panggil kaedah berdasarkan namanya pada nilai yang telah dicerminkan:
v := reflect.ValueOf(user)
m := v.MethodByName("Greet")
results := m.Call(nil)
fmt.Println(results[0].String())Prestasi
Reflection adalah 5–10× lebih perlahan daripada kod langsung. Cache carian reflect.Type dan reflect.Value di luar gelung panas. Gunakan penjanaan kod apabila prestasi sangat penting.
Semakan Pantas
Apakah perbezaan antara reflect.Type.Kind() dan reflect.Type.Name()?
Imbas Kembali: reflect.Type dan reflect.Value
Isi penting:
- reflect.TypeOf/ValueOf untuk pemeriksaan jenis pada masa jalan
- Kind: kategori asas; Name: nama yang diisytiharkan
- Value.FieldByName + SetXxx untuk memanipulasi medan struct
- Hantar penuding + panggil Elem() untuk nilai yang boleh ditetapkan
Pelajari Go dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Soalan Lazim
Adakah pelajaran “reflect.Type dan reflect.Value” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Go Academy, termasuk “reflect.Type dan reflect.Value”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Go Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “reflect.Type dan reflect.Value”?
TypeOf, ValueOf, Kind dan Elem Anda berlatih Go Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Go Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Go Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “reflect.Type dan reflect.Value” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- reflect.Type dan reflect.Value
- Memeriksa Medan dan Tag Struct
- Panggilan Fungsi Dinamik
- Refleksi Praktikal: Penyiriat