Struktur Bersarang dan Rujukan Laluan dalam Refleksi
Dalam Go, memahami struktur bersarang dan cara menghantarnya melalui rujukan dalam refleksi ialah penting. Pertimbangkan senario di mana anda mempunyai struktur Pelanggan dan Kenalan bersarang:
<code class="go">type Client struct { Id int Age int PrimaryContact Contact Name string } type Contact struct { Id int ClientId int IsPrimary bool Email string }</code>
Apabila anda mengintrospeksi medan PrimaryContact pada struct Pelanggan, anda mungkin menghadapi panik "reflect.Value.Set menggunakan nilai tidak boleh ditangani". Ini kerana PrimaryContact diluluskan oleh nilai, bukan melalui rujukan. Untuk menyelesaikan isu ini, kita perlu menghantar PrimaryContact melalui rujukan menggunakan refleksi.
Penyelesaian Menggunakan Nilai.Addr()
Kod:
<code class="go">package main import ( "fmt" "reflect" ) type Client struct { Id int Age int PrimaryContact Contact Name string } type Contact struct { Id int ClientId int IsPrimary bool Email string } func main() { client := Client{} v := reflect.ValueOf(&client) primaryContact := v.FieldByName("PrimaryContact").Addr() primaryContact.FieldByName("Id").SetInt(123) primaryContact.FieldByName("ClientId").SetInt(456) primaryContact.FieldByName("IsPrimary").SetBool(true) primaryContact.FieldByName("Email").SetString("example@example.com") fmt.Printf("%+v\n", client) }</code>
Output:
{Id:0 Age:0 PrimaryContact:{Id:123 ClientId:456 IsPrimary:true Email:example@example.com} Name:}
Isi Utama:
Atas ialah kandungan terperinci Bagaimana untuk Melepasi Struktur Bersarang Dengan Rujukan dalam Refleksi Menggunakan Value.Addr()?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!