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!