创建构造函数的映射

时间:2013-12-10 12:22:58

标签: go

所以我希望有一个函数名称映射,以根据环境变量选择接口的实现。我在以下代码中复制了它:

package test

type 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

那么我做错了什么?我可以使用*Fooer作为构造函数的返回类型吗? 实际最佳方法是什么? (我是Go的新手)

1 个答案:

答案 0 :(得分:2)

  1. 不要(几乎从不)传递指向接口的指针。你(几乎)永远不需要*FooerFooer就够了。
  2. 是的,你的Bar和Baz构造函数可以返回Fooer(不是*Fooer!),但这看起来很尴尬。
  3. 将构造函数保存在地图中并查询构造函数的地图看起来像是一个间接层次太多。你在不断创造新的Bar and Baz吗?