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提供了更大的灵活性。您可以在地图中进行初始化,它将被保留。我们将在明天进行尝试。