Mencipta Objek Ditaip dengan Go Generik
Dalam Go 1.18, generik menyediakan cara yang berkesan untuk memanipulasi jenis secara dinamik. Satu tugas biasa ialah mencipta objek baharu daripada jenis tertentu. Pertimbangkan contoh berikut:
type FruitFactory[T any] struct{} func (f FruitFactory[T]) Create() *T { // How to create a non-nil fruit here? return nil } type Apple struct { color string } func example() { appleFactory := FruitFactory[Apple]{} apple := appleFactory.Create() // Panics because nil pointer access apple.color = "red" }
FruitFactory cuba mencipta tika baharu jenis generik T. Walau bagaimanapun, sifar mengembalikan ranap program. Mari kita terokai cara mencipta objek baharu dalam senario ini:
Mencipta Objek Bukan Penunjuk
Jika jenis T bukan jenis penunjuk, anda boleh mencipta pembolehubah dan kembalikan alamatnya:
func (f FruitFactory[T]) Create() *T { var a T return &a }
Sebagai alternatif, anda boleh menggunakan new(T):
func (f FruitFactory[T]) Create() *T { return new(T) }
Mencipta Objek Penunjuk
Mencipta objek penunjuk memerlukan lebih banyak kerja. Anda boleh menggunakan inferens jenis untuk mengisytiharkan pembolehubah bukan penuding dan menukarnya kepada penuding:
// Constraining a type to its pointer type type Ptr[T any] interface { *T } // The first type param will match pointer types and infer U type FruitFactory[T Ptr[U], U any] struct{} func (f FruitFactory[T,U]) Create() T { // Declare var of non-pointer type. This is not nil! var a U // Address it and convert to pointer type (still not nil) return T(&a) } type Apple struct { color string } func main() { // Instantiating with pointer type appleFactory := FruitFactory[*Apple, Apple]{} apple := appleFactory.Create() // All good apple.color = "red" fmt.Println(apple) // &{red} }
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta Objek Ditaip Jenis Generik dengan Selamat dalam Go Menggunakan Generik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!