Jadual Kandungan
Isi soalan
Penyelesaian
Rumah pembangunan bahagian belakang Golang Bagaimana untuk menggunakan reflect.NewAt pada antara muka{}?

Bagaimana untuk menggunakan reflect.NewAt pada antara muka{}?

Feb 09, 2024 pm 02:00 PM
pergi bahasa

Bagaimana untuk menggunakan reflect.NewAt pada antara muka{}?

Editor PHP Xinyi memperkenalkan anda cara menggunakan reflect.NewAt pada antara muka{}. reflect.NewAt ialah fungsi perpustakaan pantulan dalam bahasa Go, digunakan untuk mencipta tika baharu pada jenis antara muka tertentu. Dengan menggunakan reflect.NewAt, kami boleh mencipta dan memulakan contoh antara muka baharu secara dinamik tanpa menyatakan jenis tertentu pada masa penyusunan. Ini memberikan kita lebih fleksibiliti dan dinamik, membolehkan kod menjadi lebih serba boleh dan boleh diperluaskan. Yang berikut akan memberi anda penjelasan terperinci tentang cara menggunakan reflect.NewAt untuk mencipta tika pada antara muka{}.

Isi soalan

package main

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

type Stu struct {
    Name string `json:"name"`
}

func MakeStu() interface{} {
    return Stu{
        Name: "Test",
    }
}

func main() {
    jsonData := []byte(`{"name":"New"}`)
    t1 := MakeStu()
    t2 := MakeStu()
    t3 := MakeStu()

    json.Unmarshal(jsonData, &t1)
    fmt.Println(t1) //Type of t1 becomes map[string]interface{} instead of struct Stu

    newPointer := reflect.New(reflect.ValueOf(t2).Type()).Interface()
    json.Unmarshal(jsonData, newPointer)
    fmt.Println(newPointer) //It works,but it need allocate memory to hold temp new variable

    brokenPointer := reflect.NewAt(reflect.ValueOf(t3).Type(), unsafe.Pointer(&t3)).Interface()
    json.Unmarshal(jsonData, brokenPointer)
    fmt.Println(brokenPointer) // I want to get the pointer of original type based on the existed variable t3,but it crashes.
}
Salin selepas log masuk

Jika saya tidak tahu jenis antara muka tertentu{} semasa pengekodan, saya tidak boleh menggunakan antara muka.(taip) untuk menghantar. Jadi bagaimana untuk menggunakan reflect.newat pada antara muka{}?

Jika terdapat antara muka yang mengandungi kaedah yang mengembalikan antara muka{}, jenis khususnya ialah struct, tetapi saya tidak dapat menentukan jenis struct semasa mengekod. Saya perlu menggunakan json.unmarshal untuk menyahkod data yang dikodkan oleh json. Saya tidak mahu mendapatkan map[string]interface{} , jadi saya perlu menetapkan jenis penerima kepada penuding kepada jenis antara muka konkrit{} . Menggunakan reflect.new adalah mudah, tetapi menggunakan memori tambahan, jadi saya ingin tahu cara menggunakan reflect.newat dengan antara muka sedia ada{}.

Penyelesaian

Saya ingin menghabiskan beberapa perkataan untuk menerangkan masalah itu.

Fungsi kita tiada kawalan makestu() 返回空接口 - 不是具体类型。这将使具体类型对 json.unmarshal() “不可见”,并且 json.unmarshal() 将其视为空接口,而不是具体类型 stu. Kita perlu menyampaikan jenis konkrit kepada unmarshaller entah bagaimana.

Saya akan menyelesaikan masalah ini dengan suis jenis:

func main() {
    jsondata := []byte(`{"name":"new"}`)
    t1 := makestu()

    switch c := t1.(type) {
    default:
        _ = json.unmarshal(jsondata, &c)
        t1 = c
    }

    fmt.println(t1)
}
Salin selepas log masuk
Suis

jenis menukar antara muka kosong kepada jenis konkrit dan json.unmarshal() menganggapnya sebagai jenis konkrit. Anda mungkin masih mempunyai peruntukan tambahan, tetapi kod itu lebih mudah dibaca dan anda tidak bergantung pada refleksi.

Jika saya berasa sangat mencabar, saya akan menambah fungsi pembantu yang menerima penuding kepada antara muka nol, seperti ini:

func unmarshal(data []byte, i *interface{}) (err error) {
    switch c := (*i).(type) {
    default:
        err = json.unmarshal(data, &c)
        *i = c
    }

    return err
}
Salin selepas log masuk

Ini akan membolehkan penggunaan seperti ini:

    jsonData := []byte(`{"name":"New"}`)
    t1 := MakeStu()
    unmarshal(jsonData, &t1)
Salin selepas log masuk

Ini kelihatan bersih kepada saya dan tidak melibatkan refleksi, tetapi ia tidak menggunakan reflect.newat() seperti yang anda sendiri cadangkan. Saya harap anda mendapati nasihat saya masih berguna.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan reflect.NewAt pada antara muka{}?. 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

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

Repo: Cara menghidupkan semula rakan sepasukan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

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)

Apakah masalah dengan thread giliran di crawler colly go? Apakah masalah dengan thread giliran di crawler colly go? Apr 02, 2025 pm 02:09 PM

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Perpustakaan mana yang dibangunkan oleh syarikat besar atau disediakan oleh projek sumber terbuka yang terkenal? Perpustakaan mana yang dibangunkan oleh syarikat besar atau disediakan oleh projek sumber terbuka yang terkenal? Apr 02, 2025 pm 04:12 PM

Perpustakaan mana yang dibangunkan oleh syarikat besar atau projek sumber terbuka yang terkenal? Semasa pengaturcaraan di GO, pemaju sering menghadapi beberapa keperluan biasa, ...

Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Apr 02, 2025 pm 02:06 PM

Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Di Go, mengapa rentetan percetakan dengan fungsi println dan rentetan () mempunyai kesan yang berbeza? Di Go, mengapa rentetan percetakan dengan fungsi println dan rentetan () mempunyai kesan yang berbeza? Apr 02, 2025 pm 02:03 PM

Perbezaan antara percetakan rentetan dalam bahasa Go: perbezaan kesan menggunakan fungsi println dan rentetan () sedang ...

Bagaimana untuk menyelesaikan masalah yang label struktur tersuai di Goland tidak berkuatkuasa? Bagaimana untuk menyelesaikan masalah yang label struktur tersuai di Goland tidak berkuatkuasa? Apr 02, 2025 pm 12:51 PM

Mengenai masalah tag struktur tersuai di Goland apabila menggunakan Goland untuk pembangunan bahasa Go, anda sering menghadapi beberapa masalah konfigurasi. Salah satu daripada mereka adalah ...

Kenapa perlu lulus petunjuk apabila menggunakan perpustakaan Go dan Viper? Kenapa perlu lulus petunjuk apabila menggunakan perpustakaan Go dan Viper? Apr 02, 2025 pm 04:00 PM

GO Pointer Syntax dan menangani masalah dalam penggunaan perpustakaan Viper semasa pengaturcaraan dalam bahasa Go, adalah penting untuk memahami sintaks dan penggunaan petunjuk, terutama dalam ...

Kenapa semua nilai menjadi elemen terakhir apabila menggunakan bahasa dalam bahasa Go untuk melintasi kepingan dan menyimpan peta? Kenapa semua nilai menjadi elemen terakhir apabila menggunakan bahasa dalam bahasa Go untuk melintasi kepingan dan menyimpan peta? Apr 02, 2025 pm 04:09 PM

Mengapa lelaran peta di GO menyebabkan semua nilai menjadi elemen terakhir? Dalam bahasa Go, ketika berhadapan dengan beberapa soalan wawancara, anda sering menemui peta ...

Bagaimana untuk melaksanakan operasi di Linux Ippables Linked List di Golang? Bagaimana untuk melaksanakan operasi di Linux Ippables Linked List di Golang? Apr 02, 2025 am 10:18 AM

Menggunakan Golang untuk melaksanakan Linux ...

See all articles