Masalah dan Matlamat
Dengan generik kini menjadi sebahagian daripada Go 1.18, ramai pembangun telah menetapkan sasaran mereka untuk mencipta jenis yang mewakili konsep kompleks dengan tepat. Kes klasik ialah jenis 'Sama ada[A, B]', yang menyatakan kemungkinan nilai menjadi salah satu daripada dua jenis berbeza, A atau B.
Halangan Definisi Antara Muka
Dalam mentakrifkan antara muka untuk jenis 'Sama ada', halangan muncul disebabkan oleh had bahasa untuk tidak membenarkan parameter jenis dalam kaedah antara muka. Sekatan ini menghalang kami daripada menyatakan kaedah 'Tukar', yang mengembalikan jenis berbeza berdasarkan varian nilai.
Pelaksanaan Kreatif
Untuk mengatasi isu ini, seseorang boleh dapatkan inspirasi daripada bahasa pengaturcaraan berfungsi dan laksanakan jenis 'Pilihan' yang merangkumi keupayaan untuk mewakili sama ada nilai tertentu atau ketiadaan. Berdasarkan ini, kita boleh menentukan jenis 'Sama ada':
type Either[A, B any] interface { is_left() bool is_right() bool find_left() Optional[A] find_right() Optional[B] }
Daripada bergantung pada kaedah 'Tukar', pendekatan ini memanfaatkan kaedah 'is_left' dan 'is_right' untuk menentukan jenis terkandung nilai. Kaedah 'find_left' dan 'find_right' kemudian memberikan nilai 'Pilihan' untuk jenis yang sepadan.
Butiran dan Penggunaan Pelaksanaan
Di dalam 'Kiri' dan ' Jenis konkrit yang betul yang melaksanakan 'Sama ada,' kami mengurus muatan sebenar dan menyediakan bendera boolean yang diperlukan. Fungsi 'kiri' dan 'kanan' bertindak sebagai pembina, memudahkan instantiasi.
Penggunaan sampel menunjukkan cara bekerja dengan jenis 'Sama ada':
func main() { var e1 Either[int, string] = left[int, string](4143) var e2 Either[int, string] = right[int, string]("G4143") if e1.is_left() { if l, err := e1.find_left().get(); err == nil { fmt.Printf("The int is: %d\n", l) } else { fmt.Fprintln(os.Stderr, err) } } }
Kesimpulan
Walaupun batasan generik Go menimbulkan cabaran, anda boleh mengatasinya dan mencipta abstraksi yang kuat seperti jenis 'Sama ada'. Dengan memanfaatkan 'Pilihan' dan melaksanakan antara muka tersuai dengan kaedah pembantu, pembangun boleh memperoleh fleksibiliti dan ekspresif yang mereka cari dalam kod Go mereka.
Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Melaksanakan Sama ada Jenis dalam Go, Memandangkan Had Generik dalam Kaedah Antara Muka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!