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

Dictionary 基于字符串分配预定义方法的最佳方法,dictionary,go,methods,Dictionary,Go,Methods,我试图创建一个对象数组,所有对象都有相同的成员属性和一个方法,但是每个对象都有一个稍微不同的方法。我正在努力寻找基于另一个字段(仅为字符串)将方法分配给实例的最佳方法。例如,我有一个对象 type pet struct { breed string // cat, dog, or cow name string goodboy bool speak func() } 然后我有了方法 func (p *pet) woof(){ fmt.Pr

我试图创建一个对象数组,所有对象都有相同的成员属性和一个方法,但是每个对象都有一个稍微不同的方法。我正在努力寻找基于另一个字段(仅为字符串)将方法分配给实例的最佳方法。例如,我有一个对象

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
很容易地实例化一只宠物并将speak分配给该方法。但是,我从XML文档中提取pets并将它们存储在一个数组中。理想情况下,我希望循环遍历XML文档中的所有pets并分配speak方法,然后稍后能够为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)
}
但显然,这是行不通的。我已经开始考虑各种不同的解决方法,我只是想知道最好的解决方法是什么。

这个怎么样:

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, dog, 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"
)

这样一来,它的类型就比字符串强

基本上就是这样-您有一个映射,它定义了一个要放入
func
字段中的函数,或者您有一个映射,它定义了一个用于每种类型值的类型来代替泛型
pet
类型。您的
pet
类型没有
speakMap
因此
tempPet.speakMap
无法工作,但是假设它有一个,那么您就不会初始化它,所以
tempPet.speakMap[p.breed]
也不会工作。也许是这样的?