创建构造函数图

布莱恩·希克斯(Brian Hicks):

因此,我想了解一下函数名称,以基于环境变量选择接口的实现。我在以下代码中复制了它:

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

那我在做什么错?我可以使用a *Fooer作为构造函数的返回类型吗?解决此问题实际最佳方法是什么?(我是新来的)

沃尔克:
  1. 不要(几乎从不)传递指针到接口。您(几乎)永远不需要a *Fooer,a Fooer就足够了。
  2. 是的,您的Bar和Baz构造函数可以返回一个Fooer(而不是*Fooer!),但这似乎很尴尬。
  3. 将构造函数保留在映射中并在映射中查询构造函数似乎过于间接一级。您是否在不断创建新的Bar and Baz?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章