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]
也不会工作。也许是这样的?