Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mencipta Objek Baharu Jenis Tertentu Menggunakan Generik dalam Go 1.18?

Bagaimana untuk Mencipta Objek Baharu Jenis Tertentu Menggunakan Generik dalam Go 1.18?

Patricia Arquette
Patricia Arquetteasal
2024-12-12 17:03:09299semak imbas

How to Create New Objects of a Specific Type Using Generics in Go 1.18?

Mencipta Objek Baharu dengan Generik dalam Go 1.18

Generik dalam Go 1.18 beta menawarkan cara yang berkuasa untuk mencipta kod yang fleksibel dan boleh digunakan semula. Satu tugas biasa ialah mencipta objek baharu daripada jenis tertentu. Walau bagaimanapun, melaksanakan fungsi ini memerlukan sedikit pemahaman tentang sintaks generik.

Isu: Mencipta Objek melalui Generik

Kod di bawah mentakrifkan FruitFactory dengan parameter jenis generik T. Kaedah Cipta cuba mencipta contoh baharu T (cth., *Apple), tetapi pada masa ini mengembalikan sifar, menyebabkan program ranap apabila mengakses sifat objek.

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"
}

Penyelesaian: Memulakan dan Mengembalikan Pembolehubah

Memandangkan Apple ialah jenis bukan penunjuk, kita hanya boleh mengisytiharkan pembolehubah jenis T dan mengembalikan alamatnya:

func (f FruitFactory[T]) Create() *T {
    var a T
    return &a
}

Sebagai alternatif, new(T) boleh digunakan untuk mencipta tika baharu dan mengembalikannya penunjuk:

func (f FruitFactory[T]) Create() *T {
    return new(T)
}

Dengan perubahan ini, kaedah Cipta kini mengembalikan objek jenis T yang sah, menyelesaikan isu penunjuk sifar.

Mengendalikan Jenis Penunjuk

Jika FruitFactory digunakan dengan jenis penunjuk, penyelesaian yang lebih kompleks diperlukan untuk mengelakkan kesalahan pembahagian. Antara muka tersuai, Ptr, diperlukan untuk mengekang jenis penuding dalam parameter jenis:

// Constraining a type to its pointer type
type Ptr[T any] interface {
    *T
}

// The first type parameter 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)
}

Dengan persediaan ini, kemungkinan untuk mencipta contoh baharu jenis penuding dalam kilang generik, menghalang kesilapan pembahagian.

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Objek Baharu Jenis Tertentu Menggunakan Generik dalam Go 1.18?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn