gpt4 book ai didi

go - 创建构造函数映射

转载 作者:IT王子 更新时间:2023-10-29 01:43:19 28 4
gpt4 key购买 nike

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

当我 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. 不要(几乎从不)传递指向接口(interface)的指针。您(几乎)永远不需要 *FooerFooer 就足够了。
  2. 是的,您的 Bar 和 Baz 构造函数可以返回 Fooer(不是 *Fooer!),但这看起来很尴尬。
  3. 将构造函数保存在一个映射中并在映射中查询构造函数似乎是一种间接级别。您是否不断创造新的 Bar 和 Baz?

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com