Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menukar Penunjuk Jenis Generik kepada Antara Muka Khusus dalam Go dengan Selamat?

Bagaimana untuk Menukar Penunjuk Jenis Generik kepada Antara Muka Khusus dalam Go dengan Selamat?

Barbara Streisand
Lepaskan: 2024-12-11 16:57:22
asal
570 orang telah melayarinya

How to Safely Convert a Generic Type Pointer to a Specific Interface in Go?

Tidak Boleh Menukar Parameter Jenis Generik kepada Jenis Tertentu

Dalam Go, apabila menggunakan generik, adalah penting untuk memahami hubungan antara parameter jenis generik dan kekangan mereka. Dalam kes ini, masalah berpunca daripada cuba menghantar penuding kepada parameter jenis generik (*T) sebagai hujah kepada fungsi yang menjangkakan antara muka tertentu (stringer).

Mesej ralat menerangkan bahawa *T ialah penunjuk kepada parameter jenis, tetapi ia tidak melaksanakan antara muka rentetan. Ini kerana kekangan T (FooBar) dan antara muka rentetan tidak disambungkan secara semula jadi. Untuk menyelesaikan masalah ini, adalah perlu untuk mewujudkan hubungan antara kedua-duanya.

Penyelesaian 1: Menegaskan Jenis Keselamatan (Tidak Selamat)

Satu penyelesaian adalah dengan menegaskan bahawa *T ialah stringer menggunakan sebarang(). Ini membolehkan anda menghantar penuding sebagai hujah, tetapi ia mengorbankan keselamatan jenis dan boleh menyebabkan panik masa jalan.

func blah[T FooBar]() {
    t := new(T)
    do(any(t).(stringer))
}
Salin selepas log masuk

Penyelesaian 2: Parameterizing FooBar (Jenis Selamat)

Penyelesaian lain adalah untuk membuat parameter antara muka FooBar dengan jenis generik T, memastikan bahawa parameter jenis FooBar dan parameter jenis anda lulus untuk perlawanan blah. Pendekatan ini mengekalkan keselamatan jenis dan membolehkan anda menghantar penunjuk kepada jenis tertentu yang melaksanakan antara muka rentetan.

type FooBar[T foo | bar] interface {
    *T
    stringer
}

func blah[T foo | bar, U FooBar[T]]() {
    var t T
    do(U(&t))
}
Salin selepas log masuk

Penjelasan:

  • Kekangan T kini adalah foo atau bar dan FooBar diparameterkan dengan T.
  • Anda boleh mencipta penuding kepada jenis tertentu (cth., *foo) dan hantarkannya ke blah, yang akan menjadikan FooBar dengan jenis yang sepadan.
  • Penukaran U(&t) kini sah kerana U dan penuding kepada T mempunyai set jenis yang sama.

Penyelesaian ini membolehkan anda menghantar contoh jenis tertentu yang melaksanakan antara muka rentetan dan memastikan keselamatan jenis semasa instantiasi.

Atas ialah kandungan terperinci Bagaimana untuk Menukar Penunjuk Jenis Generik kepada Antara Muka Khusus dalam Go dengan Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan