Kes penggunaan khas dan teknik generik dalam golang

王林
Lepaskan: 2024-05-02 22:48:01
asal
792 orang telah melayarinya

Kes dan helah penggunaan khas untuk generik dalam Go Gunakan antara muka jenis kosong untuk semakan jenis dinamik untuk menyemak jenis masa jalan. Gunakan parameter jenis generik dalam koleksi untuk mencipta bekas pelbagai jenis. Laksanakan kaedah generik untuk melaksanakan operasi biasa untuk pelbagai jenis parameter. Gunakan kekangan jenis untuk melaksanakan generik khusus jenis dan menyesuaikan operasi untuk jenis tertentu.

Kes penggunaan khas dan teknik generik dalam golang

Kes Penggunaan Khas dan Petua untuk Generik dalam Go

Generik memperkenalkan ciri baharu yang membolehkan anda menulis kod yang fleksibel dan cekap. Artikel ini akan meneroka kes dan teknik penggunaan khas untuk generik dalam Go.

1. Gunakan antara muka jenis kosong untuk semakan jenis dinamik

any Jenis boleh mewakili sebarang jenis. Ini membolehkan kami melakukan semakan jenis dinamik berdasarkan jenis yang ditentukan semasa masa jalan.

func isString(v any) bool {
    _, ok := v.(string)
    return ok
}

func main() {
    x := "hello"
    y := 10
    fmt.Println(isString(x)) // true
    fmt.Println(isString(y)) // false
}
Salin selepas log masuk

2. Menggunakan jenis generik pada koleksi

Parameter jenis generik boleh digunakan dalam jenis koleksi untuk mencipta bekas pelbagai jenis.

type Stack[T any] []T

func (s *Stack[T]) Push(v T) {
    *s = append(*s, v)
}

func (s *Stack[T]) Pop() T {
    if s.IsEmpty() {
        panic("stack is empty")
    }

    v := (*s)[len(*s)-1]
    *s = (*s)[:len(*s)-1]
    return v
}

func main() {
    s := new(Stack[int])
    s.Push(10)
    s.Push(20)
    fmt.Println(s.Pop()) // 20
    fmt.Println(s.Pop()) // 10
}
Salin selepas log masuk

3. Laksanakan kaedah generik

Kaedah generik membolehkan kami melaksanakan operasi biasa untuk pelbagai jenis parameter.

type Num[T numeric] struct {
    V T
}

func (n *Num[T]) Add(other *Num[T]) {
    n.V += other.V
}

func main() {
    n1 := Num[int]{V: 10}
    n2 := Num[int]{V: 20}
    n1.Add(&n2)
    fmt.Println(n1.V) // 30

    // 可以使用其他数字类型
    n3 := Num[float64]{V: 3.14}
    n4 := Num[float64]{V: 2.71}
    n3.Add(&n4)
    fmt.Println(n3.V) // 5.85
}
Salin selepas log masuk

4. Laksanakan generik khusus jenis menggunakan kekangan jenis

Kekangan jenis mengehadkan skop jenis generik. Ia membolehkan kami melaksanakan operasi tersuai untuk jenis tertentu.

type Comparer[T comparable] interface {
    CompareTo(T) int
}

type IntComparer struct {
    V int
}

func (c *IntComparer) CompareTo(other IntComparer) int {
    return c.V - other.V
}

// IntSlice 实现 Comparer[IntComparer] 接口
type IntSlice []IntComparer

func (s IntSlice) Len() int {
    return len(s)
}

func (s IntSlice) Less(i, j int) bool {
    return s[i].CompareTo(s[j]) < 0
}

func (s IntSlice) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}

func main() {
    s := IntSlice{{10}, {20}, {5}}
    sort.Sort(s)
    fmt.Println(s) // [{5} {10} {20}]
}
Salin selepas log masuk

Kes dan teknik penggunaan khas ini menunjukkan kuasa generik dalam Go, membolehkan penciptaan kod yang lebih serba boleh, fleksibel dan cekap.

Atas ialah kandungan terperinci Kes penggunaan khas dan teknik generik dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!