Go 如何以惯用的方式返回struct实例

Go 如何以惯用的方式返回struct实例,go,Go,我有一个函数,它根据所用的参数返回结构实例 func Factory(s string) interface{} { if s == 'SomeType' { return SomeType{} } else if s == 'AnotherType' { return AnotherType{} } } 如果我有两个结构要返回,这个解决方案是好的,但是如果有很多结构,它会变得很难看,我可以用其他方法吗?有没有惯用的方法可以做到这一点?正

我有一个函数,它根据所用的参数返回结构实例

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

如果我有两个结构要返回,这个解决方案是好的,但是如果有很多结构,它会变得很难看,我可以用其他方法吗?有没有惯用的方法可以做到这一点?

正如评论所说,您可以使用映射来表示您的类型。看起来像这样。如果类型存在,则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"))
}

可以使用映射将字符串映射到要返回的内容。或者,如果它比返回空结构更复杂,映射可以将字符串映射到生成值的函数。有些人只是给出指导而不是给出一个完整的解决方案,这并不少见。@AndySchweig对此评论我很抱歉,但有时我不明白为什么这里的人投了反对票,我在他们的行为中找不到任何逻辑。我想映射到函数就是我要搜索的。谢谢你的回答@mad wombat,但它不是每次我调用factory时都返回相同的实例吗?是的,它会。很抱歉每次都可以使用“反射”创建新值。更新了代码和链接实际上,再次更新,看起来使用ValueOf而不是New提供了更大的灵活性。您可以在地图中进行初始化,它将被保留。我们将在明天进行尝试。