Лучший способ назначить предопределенные методы на основе строки - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь получить массив объектов, которые имеют одинаковые свойства-члены и один метод, однако у каждого объекта будет свой метод. Я изо всех сил пытаюсь найти лучший способ назначить метод экземпляру на основе другого поля, которое является просто строкой. Например, у меня есть объект

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 и назначить метод speak, а затем иметь возможность вызывать любой метод speak() для любого объекта в массиве pets. Сначала я думал о создании карты, но вы не можете хранить приемники на карте функций. Это был мой мыслительный процесс для чего-то вроде того, как это должно работать:

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)
}

, но, очевидно, это не работает. Я уже начал думать о различных обходных путях, и мне просто интересно, как лучше всего это сделать.

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Лучшей идеей было бы иметь карту

map[AvailableFunc]func c() {}

, где

type AvailableFunc string 

const (
Func1 AvailableFunc = "Func1"
)

Таким образом, она будет напечатана более строго по сравнению со строкой.

1 голос
/ 04 ноября 2019

Как насчет этого:

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) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...