所以我想要一个函数名称映射,以根据环境变量选择接口(interface)的实现。我用以下代码重现了它:
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,
}
}
当我构建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 新手)
最佳答案
- 不要(几乎从不)传递接口(interface)指针。您(几乎)永远不需要
*Fooer
,一个Fooer
就足够了。 - 是的,您的 Bar 和 Baz 构造函数可以返回
Fooer
(不是*Fooer
!),但这看起来很尴尬。 - 将构造函数保留在映射中并在映射中查询构造函数似乎过多了一层间接性。您是否在不断创造新的 Bar 和 Baz?
关于go - 创建构造函数的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20494445/