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)) }
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)) }
Penjelasan:
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!