我需要帮助使此类型适用于任何类型。
我有一个函数,我需要接受具有ID属性的其他类型。
ID
我尝试使用接口,但不适用于我的ID财产情况。这是代码:
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 { // How can i get this function to accept any type not just []Mammal IDs := make([]string, len(ms)) for i, m := range ms { IDs[i] = strconv.Itoa(int(m.ID)) } return &IDs } func main(){ mammals := []Mammal{ Mammal{1, "Carnivorious"}, Mammal{2, "Ominivorious"}, } humans := []Human{ Human{ID:1, Name: "Peter", HairColor: "Black"}, Human{ID:2, Name: "Paul", HairColor: "Red"}, } numberOfMammalIDs := Count(mammals) numberOfHumanIDs := Count(humans) fmt.Println(numberOfMammalIDs) fmt.Println(numberOfHumanIDs) }
我明白了
错误prog.go:39:在Count的参数中无法将人类([人类]类型)用作[]哺乳动物
有关更多详细信息,请参见Go Playground,网址为http://play.golang.org/p/xzWgjkzcmH
使用接口而不是具体类型,并使用嵌入式接口,因此不必在两种类型中都列出常用方法:
type Mammal interface { GetID() int GetName() string } type Human interface { Mammal GetHairColor() string }
这是基于使用嵌入式类型(结构)的代码的这些接口的实现:
type MammalImpl struct { ID int Name string } func (m MammalImpl) GetID() int { return m.ID } func (m MammalImpl) GetName() string { return m.Name } type HumanImpl struct { MammalImpl HairColor string } func (h HumanImpl) GetHairColor() string { return h.HairColor }
但是,当然,在您的Count()函数中,您只能引用方法,而不能引用实现的字段:
Count()
IDs[i] = strconv.Itoa(m.GetID()) // Access ID via the method: GetID()
并创建您的哺乳动物和人类切片:
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"}, }
这是 Go Playground 上的完整工作代码。