Dengan pengenalan generik dalam Go 1.18, adalah mungkin untuk mencipta struktur data generik, seperti Mana-mana jenis, yang boleh mewakili salah satu daripada dua nilai yang mungkin. Ini menangani had pengembalian nilai dan ralat, seperti dalam pendekatan Go idiomatik untuk mengendalikan ralat.
Satu pendekatan untuk melaksanakan Mana-mana jenis generik melibatkan penggunaan jenis None dan antara muka Pilihan. Tiada yang mewakili ketiadaan nilai, manakala Pilihan menyediakan cara untuk mendapatkan semula nilai atau ralat. Selain itu, jenis Kiri dan Kanan ditakrifkan untuk mewakili dua kemungkinan nilai yang boleh dipegang oleh Mana-mana.
type Optional[T any] interface { get() (T, error) } type None[T any] struct {} type Some[T any] struct { data T }
Antara muka Either menawarkan kaedah untuk menentukan sama ada ia memegang nilai kiri atau kanan, dan kaedah untuk mengakses kedua-dua jenis daripada nilai menggunakan kaedah cari.
type Either[A, B any] interface { is_left() bool is_right() bool find_left() Optional[A] find_right() Optional[B] } type Left[A, B any] struct { data A } type Right[A, B any] struct { data B }
Fungsi pembantu disediakan untuk mencipta Sama ada kejadian dan mengaksesnya nilai.
func left[A, B any](data A) Either[A, B] func right[A, B any](data B) Either[A, B]
Contoh berikut menunjukkan penggunaan Sama ada jenis:
var e1 Either[int, string] = left[int, string](4143) var e2 Either[int, string] = right[int, string]("G4143") fmt.Println(e1) fmt.Println(e2)
Outputnya ialah:
left(4143) right(G4143)
Dengan mengakses is_left dan is_right kaedah, adalah mungkin untuk menentukan jenis nilai yang dipegang oleh Sama ada. Menggunakan kaedah find_left dan find_right, nilai sebenar boleh diambil semula.
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) } } if e2.is_right() { if r, err := e2.find_right().get(); err == nil { fmt.Printf("The string is: %s\n", r) } else { fmt.Fprintln(os.Stderr, err) } }
Contoh ini menunjukkan cara Mana-mana jenis boleh digunakan untuk mewakili dan mengendalikan pelbagai jenis nilai dengan cara yang fleksibel dan selamat jenis.
Atas ialah kandungan terperinci Bagaimanakah Generik Go Boleh Digunakan untuk Melaksanakan Sama ada Jenis yang Fleksibel dan Selamat Jenis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!