Saya mahukan antara muka yang boleh menghantar parameter apa-apa jenis kepada kaedah tunggalnya dan saya mahukan struktur pelaksanaan tunggal dengan generik.
Ini adalah versi masalah saya yang sangat mudah:
package main type MyInterface interface { Set(val any) } type MyStruct[T any] struct { val T } func NewMyStruct[T any]() *MyStruct[T] { return &MyStruct[T]{} } func (s *MyStruct[T]) Set(val T) { s.val = val } func main() { var obj MyInterface obj = NewMyStruct[any]() // accepted obj = NewMyStruct[int]() // not accepted obj = NewMyStruct[string]() // not accepted }
Adakah terdapat cara untuk memenuhi keperluan pengkompil tanpa kehilangan maklumat jenis kaedah Set apabila berurusan dengan struct secara langsung?
Saya rasa kod anda boleh diubah suai seperti ini
package main import "fmt" type MyInterface[T any] interface { Set(value T) } type MyStruct[T any] struct { val T } func NewMyStruct[T any]() *MyStruct[T] { return &MyStruct[T]{} } func (s *MyStruct[T]) Set(val T) { s.val = val } func main() { var obj1 MyInterface[int] obj1 = NewMyStruct[int]() var obj2 MyInterface[string] obj2 = NewMyStruct[string]() var obj3 MyInterface[any] obj3 = NewMyStruct[any]() }
Setiap kali anda menggunakan jenis parameter, anda mesti menggantikan parameter jenis dalam definisinya dengan jenis sebenar. Ini bermakna jenis generik dalam antara muka mesti dibuat instantiated. Untuk ini, antara muka anda harus diisytiharkan seperti ini.
// As-is type MyInterface interface { Set(val any) } // To-be type MyInterface[T any] interface { Set(val T) }
Dan apabila menggunakannya, anda harus jelas tentang jenis any
yang anda gunakan.
func main() { var obj1 MyInterface[int] obj1 = NewMyStruct[int]() }
Saya petik dua muka surat
[1] Go error: Tidak boleh menggunakan jenis generik bukan instan
[2] Bagaimana untuk melaksanakan antara muka universal?
Atas ialah kandungan terperinci Melaksanakan kaedah antara muka menggunakan struktur jenis generik dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!