Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Generik Go Boleh Digunakan untuk Melaksanakan Sama ada Jenis yang Fleksibel dan Selamat Jenis?

Bagaimanakah Generik Go Boleh Digunakan untuk Melaksanakan Sama ada Jenis yang Fleksibel dan Selamat Jenis?

Barbara Streisand
Lepaskan: 2024-12-09 01:34:09
asal
236 orang telah melayarinya

How Can Go's Generics Be Used to Implement a Flexible and Type-Safe Either Type?

Melaksanakan Sama ada Jenis Generik dalam Go

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

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

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

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

Outputnya ialah:

left(4143)
right(G4143)
Salin selepas log masuk

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

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!

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