Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mencipta Objek Ditaip Jenis Generik dengan Selamat dalam Go Menggunakan Generik?

Bagaimanakah Saya Boleh Mencipta Objek Ditaip Jenis Generik dengan Selamat dalam Go Menggunakan Generik?

Barbara Streisand
Lepaskan: 2024-12-08 06:55:10
asal
823 orang telah melayarinya

How Can I Safely Create Typed Objects of a Generic Type in Go Using Generics?

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"
}
Salin selepas log masuk

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
}
Salin selepas log masuk

Sebagai alternatif, anda boleh menggunakan new(T):

func (f FruitFactory[T]) Create() *T {
    return new(T)
}
Salin selepas log masuk

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}
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan