我有函数返回结构实例取决于它所需要的参数

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

如果我要返回几个结构,则此解决方案很好,但如果有很多结构,这将变得很丑陋,我可以采用其他方法吗?有惯用的方法吗?

最佳答案

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

关于go - 如何返回结构实例,惯用方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55306399/

10-13 04:09