Как вернуть экземпляр структуры, идиоматическим способом - PullRequest
0 голосов
/ 22 марта 2019

У меня есть функция, которая возвращает экземпляр структуры в зависимости от аргумента, который требуется

func Factory(s string) interface{} {
    if s == 'SomeType' {
        return SomeType{}
    } else if s == 'AnotherType' {
        return AnotherType{}
    }
}

Это решение хорошо, если у меня есть пара структур для возврата, но становится уродливым, если их многоМогу ли я сделать это по-другому?Есть ли идиоматический способ сделать это?

1 Ответ

1 голос
/ 22 марта 2019

Как сказано в комментарии, вы можете использовать карту для своих типов.Похоже на это.Функция factory возвращает экземпляр, если тип существует, или nil, если его нет.основной пакет

import (
    "fmt"
    "reflect"
)

type SomeType struct{ Something string }
type AnotherType struct{}
type YetAnotherType struct{}

var typemap = map[string]interface{}{
    "SomeType":       SomeType{ Something: "something" },
    "AnotherType":    AnotherType{},
    "YetAnotherType": YetAnotherType{},
}

func factory(s string) interface{} {
    t, ok := typemap[s]
    if ok {
        return reflect.ValueOf(t)
    }
    return nil
}

func main() {
    fmt.Printf("%#v\n", factory("SomeType"))
    fmt.Printf("%#v\n", factory("NoType"))
}

ссылка на игровую площадку

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