如何返回结构实例,惯用方式

时间:2019-03-22 19:13:43

标签: go

我有一个函数根据需要的参数返回结构实例

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

如果我有几个返回的结构,此解决方案是好的,但是如果有很多结构,它将变得很难看,我可以用其他方法来做吗?有惯用的方法吗?

1 个答案:

答案 0 :(得分:1)

正如评论所说,您可以为您的类型使用地图。看起来像这样。如果类型存在,则工厂函数将返回一个实例,否则将返回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"))
}

Playground link