Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menggunakan Kaedah Dikongsi dengan Kekangan Jenis Kesatuan dalam Go Generics?

Bagaimanakah Saya Boleh Menggunakan Kaedah Dikongsi dengan Kekangan Jenis Kesatuan dalam Go Generics?

Barbara Streisand
Barbara Streisandasal
2024-12-23 12:30:09180semak imbas

How Can I Use Shared Methods with Union Type Constraints in Go Generics?

Kekangan Generik dalam Go: Menggunakan Kaedah Dikongsi untuk Jenis Kesatuan

Generik In Go (v1.18), jenis kekangan kesatuan membolehkan anda untuk menentukan set jenis yang boleh diberikan kepada parameter jenis generik. Walau bagaimanapun, menggunakan kaedah dikongsi untuk jenis ini boleh membawa kepada ralat.

Pertimbangkan kod berikut:

type A struct {}
type B struct {}

type AB interface {
    *A | *B
}

func (a *A) some() bool {
    return true
}

func (b *B) some() bool {
    return false
}

func some[T AB](x T) bool {
    return x.some()   // <- error
}

Ralat berlaku kerana pengkompil tidak dapat mencari beberapa kaedah pada jenis kesatuan AB . Untuk menyelesaikan masalah ini, anda perlu menambahkan kaedah pada kekangan antara muka:

type AB interface {
    *A | *B
    some() bool
}

func some[T AB](x T) bool {
    return x.some()   // works
}

Ini mengehadkan jenis generik T kepada jenis yang melaksanakan kedua-dua *A dan *B, dan juga mentakrifkan beberapa kaedah.

Walau bagaimanapun, seperti yang dinyatakan dalam nota keluaran Go 1.18, ini adalah pengehadan sementara. Go 1.19 dijangka akan mengalih keluar sekatan ini, membenarkan pengkompil membuat kesimpulan secara automatik beberapa kaedah daripada jenis kesatuan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Kaedah Dikongsi dengan Kekangan Jenis Kesatuan dalam Go Generics?. 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