为了账号安全,请及时绑定邮箱和手机立即绑定

创建构造函数的映射

创建构造函数的映射

Go
Smart猫小萌 2021-07-09 18:50:43
所以我想要一个函数名称的映射,以根据环境变量选择接口的实现。我在以下代码中复制了它:package testtype Fooer interface {    Foo() error}type Bar struct{}func NewBar() (*Bar, error) { return &Bar{}, nil }func (b *Bar) Foo() error   { return nil }type Baz struct{}func NewBaz() (*Baz, error) { return &Baz{}, nil }func (b *Baz) Foo() error   { return nil }var constructors map[string]func() (*Fooer, error)func init() {    constructors = map[string]func() (*Fooer, error){        "bar": NewBar,        "baz": NewBaz,    }}当我这样做时,这会引发以下错误go build test.go:./test.go:21: cannot use NewBar (type func() (*Bar, error)) as type func() (*Fooer, error) in map value./test.go:22: cannot use NewBaz (type func() (*Baz, error)) as type func() (*Fooer, error) in map value那么我做错了什么?我可以使用 a*Fooer作为构造函数的返回类型吗?解决这个问题的实际最佳方法是什么?(我是 Go 新手)
查看完整描述

1 回答

?
MM们

TA贡献1886条经验 获得超2个赞

  1. 不要(几乎从不)传递指向接口的指针。你(几乎)永远不需要 a *Fooer, aFooer就足够了。

  2. 是的,你的 Bar 和 Baz 构造函数可以返回一个Fooer(不是一个*Fooer!),但这看起来很尴尬。

  3. 将构造函数保留在映射中并在映射中查询构造函数似乎过于间接。您是否在不断创造新的 Bar 和 Baz?


查看完整回答
反对 回复 2021-07-12
  • 1 回答
  • 0 关注
  • 209 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信