Bagaimana untuk menukar jenis yang diketahui kepada penunjuk kepada parameter jenis dalam suis?

王林
Lepaskan: 2024-02-09 11:30:18
ke hadapan
993 orang telah melayarinya

Bagaimana untuk menukar jenis yang diketahui kepada penunjuk kepada parameter jenis dalam suis?

Editor PHP Banana akan memperkenalkan kepada anda cara menukar jenis yang diketahui kepada penunjuk yang menunjuk kepada parameter jenis dalam suis. Dalam pengaturcaraan, kadangkala kita perlu menukar pembolehubah jenis yang diketahui kepada penunjuk untuk operasi yang lebih fleksibel dalam atur cara. Penukaran ini boleh dicapai dengan menggunakan operator "&". Awalan nama pembolehubah dengan operator "&" untuk menukarnya menjadi penunjuk kepada pembolehubah. Dengan cara ini, kita boleh menggunakan penunjuk dalam atur cara untuk memanipulasi pembolehubah dan bukannya hanya memberikan atau membacanya. Seterusnya, kami akan memperincikan cara melakukan penukaran jenis ini dan menyediakan kod sampel untuk membantu anda memahami dengan lebih baik.

Kandungan soalan

Saya cuba menulis fungsi yang menukar tatasusunan bait rentetan json kepada tatasusunan bait lain berdasarkan parameter jenis bagi nilai pulangan adalah seperti berikut:

  • peta[rentetan]antaramuka{}: ditukar kepada peta[rentetan]antaramuka{}
  • []bait: Tiada penukaran, kembali seperti sedia ada
  • struct: Tukar kepada struct

Kod saya adalah seperti berikut:

func getjsondata[t any](jsonbytearray []byte) (result *t, err error) {
    var buff t

    switch any(result).(type) { // https://appliedgo.com/blog/a-tip-and-a-trick-when-working-with-generics
    case *[]byte:
        result = &t(jsonbytearray)
    default:
        err = json.unmarshal(jsonbytearray, &buff)
        result = &buff
    }

    return
}
Salin selepas log masuk

Kod ini menyebabkan ralat jenis apabila menukar jenis jsonbytearray kepada t, seperti ditunjukkan di bawah:

cannot convert jsonByteArray (variable of type []byte) to type T
Salin selepas log masuk

Bagaimana untuk menetapkan penuding pembolehubah jenis []bait ini kepada nilai pulangan jenis generik?

Penyelesaian

Disebabkan t受到any的约束,所以不能直接转换。您必须断言 &jsonbytearray 实际上与该开关情况下的 *t jenis yang sama:

func getjsondata[t any](jsonbytearray []byte) (result *t, err error) {
    var buff t

    switch any(result).(type) {
    case *[]byte:
        result = any(&jsonbytearray).(*t)
    default:
        err = json.unmarshal(jsonbytearray, &buff)
        result = &buff
    }

    return
}
Salin selepas log masuk

Ini membuatkan ralat kompilasi hilang, tetapi reka bentuk ini tidak begitu baik. Jika anda perlu menggunakan json.unmarshal 专门用于一种类型 (*[]byte), anda lebih baik menukar tapak panggilan daripada menggunakan fungsi generik.

Saya menganggap matlamat anda adalah untuk membenarkan pemanggil mendapatkan sepotong bait seperti sedia ada, dan bukannya membuangnya. Kemudian di tapak panggilan anda boleh memanggil fungsi sebagai

data := GetJsonData[[]byte](jsonByteArray)
Salin selepas log masuk

Ini bermakna pada ketika ini anda sudah tahu jsonbytearray ialah kepingan bait.

Kemudian, tiada sebab untuk memanggil fungsi ini. Anda hanya boleh mendapatkan alamat parameter: data := &jsonbytearray ,并在其他地方使用 json.unmarshal .

Atas ialah kandungan terperinci Bagaimana untuk menukar jenis yang diketahui kepada penunjuk kepada parameter jenis dalam suis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
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
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!