Rumah > pembangunan bahagian belakang > Golang > Cara Membuat Fungsi Go Generik Menggunakan Antara Muka: Penyelesaian Kekangan Jenis

Cara Membuat Fungsi Go Generik Menggunakan Antara Muka: Penyelesaian Kekangan Jenis

DDD
Lepaskan: 2024-10-27 02:28:30
asal
424 orang telah melayarinya

 How to Make Go Functions Generic Using Interfaces: A  Type Constraint Solution

Parameter Kaedah Generik dalam Go: Menyelesaikan Isu Kekangan Jenis

Masalah:

Pertimbangkan kod Go berikut:

<code class="go">package main

import (
    "fmt"
    "strconv"
)

type Mammal struct {
    ID int
    Name string
}

type Human struct {
    ID int
    Name string
    HairColor string
}

func Count(ms []Mammal) *[]string {
    IDs := make([]string, len(ms))
    for i, m := range ms {
        IDs[i] = strconv.Itoa(int(m.ID))
    }
    return &IDs
}

func main() {
    ... // Code to create Mammal and Human slices
    numberOfMammalIDs := Count(mammals)
    numberOfHumanIDs := Count(humans)
    fmt.Println(numberOfMammalIDs)
    fmt.Println(numberOfHumanIDs)
}</code>
Salin selepas log masuk

Kod ini gagal dihimpun dengan ralat ralat prog.go:39: tidak boleh menggunakan manusia (taip []Manusia) sebagai jenis []Mammal dalam hujah ke Count. Isu ini timbul kerana fungsi Count menjangkakan tatasusunan struktur Mamalia, tetapi kami menghantar tatasusunan struktur Manusia. Bagaimanakah kita boleh menyelesaikan kekangan jenis ini dan menjadikan fungsi Count cukup generik untuk menerima sebarang jenis yang mempunyai sifat ID?

Penyelesaian:

1. Gunakan Antara Muka:

Ganti jenis konkrit dengan antara muka yang mentakrifkan sifat ID. Contohnya:

<code class="go">type Mammal interface {
    GetID() int
}

type Human interface {
    Mammal
    GetHairColor() string
}</code>
Salin selepas log masuk

2. Antara Muka Benam:

Untuk mengelakkan pendua kaedah ID dalam kedua-dua antara muka Mamalia dan Manusia, gunakan antara muka terbenam:

<code class="go">type MammalImpl struct {
    ID int
    Name string
}

func (m MammalImpl) GetID() int {
    return m.ID
}

type HumanImpl struct {
    MammalImpl
    HairColor string
}</code>
Salin selepas log masuk

3. Kemas Kini Fungsi Kiraan:

Ubah suai fungsi Kira untuk menggunakan antara muka Mamalia dan bukannya jenis Mamalia konkrit:

<code class="go">func Count(ms []Mammal) *[]string {
    IDs := make([]string, len(ms))
    for i, m := range ms {
        IDs[i] = strconv.Itoa(m.GetID())
    }
    return &IDs
}</code>
Salin selepas log masuk

4. Cipta Kepingan Mematuhi Antara Muka:

Buat kepingan yang melaksanakan antara muka Mamalia:

<code class="go">mammals := []Mammal{
    MammalImpl{1, "Carnivorious"},
    MammalImpl{2, "Ominivorious"},
}

humans := []Mammal{
    HumanImpl{MammalImpl: MammalImpl{ID: 1, Name: "Peter"}, HairColor: "Black"},
    HumanImpl{MammalImpl: MammalImpl{ID: 2, Name: "Paul"}, HairColor: "Red"},
}</code>
Salin selepas log masuk

5. Contoh Penggunaan:

Contoh penggunaan yang kini berjaya menyusun:

<code class="go">package main

import (
    "fmt"
    "strconv"
)

type Mammal interface {
    GetID() int
}

type Human interface {
    Mammal
    GetHairColor() string
}

type MammalImpl struct {
    ID   int
    Name string
}

func (m MammalImpl) GetID() int {
    return m.ID
}

type HumanImpl struct {
    MammalImpl
    HairColor string
}

func (h HumanImpl) GetHairColor() string {
    return h.HairColor
}

func Count(ms []Mammal) *[]string {
    IDs := make([]string, len(ms))
    for i, m := range ms {
        IDs[i] = strconv.Itoa(m.GetID())
    }
    return &IDs
}

func main() {
    mammals := []Mammal{
        MammalImpl{1, "Carnivorious"},
        MammalImpl{2, "Ominivorous"},
    }

    humans := []Mammal{
        HumanImpl{MammalImpl: MammalImpl{ID: 1, Name: "Peter"}, HairColor: "Black"},
        HumanImpl{MammalImpl: MammalImpl{ID: 2, Name: "Paul"}, HairColor: "Red"},
    }

    numberOfMammalIDs := Count(mammals)
    numberOfHumanIDs := Count(humans)
    fmt.Println(numberOfMammalIDs) // [1 2]
    fmt.Println(numberOfHumanIDs) // [1 2]
}</code>
Salin selepas log masuk

Dengan menggunakan antara muka dan antara muka terbenam, kami telah menjadikan fungsi Count cukup generik untuk mengendalikan sebarang jenis yang melaksanakan Antara muka mamalia, menyelesaikan isu kekangan jenis dengan berkesan.

Atas ialah kandungan terperinci Cara Membuat Fungsi Go Generik Menggunakan Antara Muka: Penyelesaian Kekangan 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan