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

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

DDD
DDDasal
2024-10-27 02:28:30342semak imbas

 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>

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>

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>

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>

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>

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>

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!

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