基于字符串分配预定义方法的最佳方法

我正在尝试拥有所有具有相同成员属性和单个方法的对象数组,但是每个对象将具有略有不同的方法。我正在努力寻找将方法分配给基于另一个字段(只是一个字符串)的实例的最佳方法。例如,我有对象

type pet struct {
    breed   string  // cat,dog,or cow
    name    string
    goodboy bool
    speak   func()
}

然后我有方法

func (p *pet) woof(){
    fmt.Println("woof")
    p.goodboy = true
}

func (p *pet) meow(){
    fmt.Println("meow")
    p.goodboy = true
}

func (p *pet) moo(){
    fmt.Println("moo")
    p.goodboy = true
}

我可以实例化一个宠物,并使用spot.speak = spot.woof来轻松地为该方法分配语音。但是,我从XML文档中提取宠物并将它们存储在数组中。理想情况下,我想遍历XML文档中的所有pets并分配talk方法,然后以后可以为pets数组中的任何对象调用任何speak()方法。最初我想创建一个映射,但是您不能在函数映射中存储接收者。这是我对工作方式的思考过程:

for _,p := range petsFromXML{
    var tempPet pet
    tempPet.breed = p.breed
    tempPet.name = p.name
    tempPet.goodboy = false
    tempPet.speak = tempPet.speakMap[p.breed]
    pets = append(pets,tempPet)
}

但是显然这是行不通的。我已经开始考虑各种不同的解决方法,而我只是想知道实现此目的的最佳方法是什么。

wfsysysakk 回答:基于字符串分配预定义方法的最佳方法

如何?

type pet struct {
    breed   string  // cat,dog,or cow
    name    string
    goodboy bool
}

func (p *pet) speak() {
   funcMap[p.breed](p)
}

func woof(p *pet){
    fmt.Println("woof")
    p.goodboy = true
}

var funcMap=map[string]func(*pet){}

如果您真的想使用函数指针:

type pet struct {
    breed   string  // cat,or cow
    name    string
    goodboy bool
    speak   func()
}

func woof(p *pet){
    fmt.Println("woof")
    p.goodboy = true
}

var funcMap=map[string]func(*pet){}

var p pet
p.breed="cat"
p.speak=func() { funcMap[p.breed](&p) }
,

一个更好的主意是拥有

的地图
map[AvailableFunc]func c() {}

其中

type AvailableFunc string 

const (
Func1 AvailableFunc = "Func1"
)

那样,与仅字符串相比,它的类型更加强大。

本文链接:https://www.f2er.com/3164180.html

大家都在问