Существует ли более идиоматический подход к созданию переменных определенных типов на основе входных данных? - PullRequest
0 голосов
/ 17 января 2019

В этой ссылке на игровую площадку Я создал надуманную версию своего кода, в которой я создаю переменную типа X на основе входной строки.Переменная будет одним из нескольких типов и реализует интерфейс.

Код в настоящее время компилируется и дает правильный результат, однако он кажется мне довольно многословным, и я пытаюсь выяснить, существует ли сокращенный подход к результату, которого я достигаю.В примере есть 3 типа (собака, кошка и птица), которые реализуют интерфейс (животное), однако мой фактический код будет содержать до 40 типов в этом операторе switch.

Причина, по которой я использую этот код, заключается в том, что при получении результатов из СУБД я пытаюсь использовать универсальный метод загрузки, который в сочетании с sqlx загружает таблицу базы данных вправильная структура на основе входной строки.Я имею полный контроль над приложением и могу изменить входную строку на другой тип, если требуется.

Код с детской площадки ссылка:

package main

import (
    "fmt"
)

type animal interface {
    call() string
}

type dog struct {
}

func (d *dog) call() string {
    return "Woof!"
}

type cat struct {
}

func (c *cat) call() string {
    return "Meow!"
}

type bird struct {
}

func (c *bird) call() string {
    return "Chirp!"
}

func main() {
    var animal animal
    animalType := "dog"
    switch animalType{
    case "dog":
        animal = new(dog)
    case "cat":
        animal = new(cat)
    case "bird":
        animal = new(bird)

1 Ответ

0 голосов
/ 17 января 2019

Вы можете создать hashmap из «string» в «function, которая возвращает animal», но его настройка будет более многословной, чем оператор switch.

Примерно так (не проверено)

type AnimalCtor func() animal

var animalMap map[string]AnimalCtor

.....

func init() {
    animalMap["dog"] = func() animal { return &dog{} }
    animalMap["cat"] = func() animal { return &cat{} }
    animalMap["bird"] = func() animal { return &bird{} }
    .....
}

func createAnimalFromString(input string) animal {
    ctor, ok := animalMap[input]
    if ok {
        return ctor()
    } else {
        return nil
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...