go - 创建构造函数的映射

标签 go

所以我想要一个函数名称映射,以根据环境变量选择接口(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 新手)

最佳答案

  1. 不要(几乎从不)传递接口(interface)指针。您(几乎)永远不需要 *Fooer,一个 Fooer 就足够了。
  2. 是的,您的 Bar 和 Baz 构造函数可以返回 Fooer(不是 *Fooer!),但这看起来很尴尬。
  3. 将构造函数保留在映射中并在映射中查询构造函数似乎过多了一层间接性。您是否在不断创造新的 Bar 和 Baz?

关于go - 创建构造函数的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20494445/

相关文章:

go - 如何分发 Go 应用程序?

ajax - 在 golang 中提供多个静态文件并发出 post 请求

windows - 执行 : "gcc": executable file not found in %PATH% when trying go build

go - Go 中的查找表?

go - 解决模拟流的基准函数中的数据竞争

go - 如何排除列被选中

postgresql - 无法将 json 范围读取为 pgtype.Int4range

android-studio - Gomobile 工具链已过时,仅适用于 Android Studio

go - 如何在应用程序中保持单个 AWS S3 session ?

arrays - 解析显式数组