gpt4 book ai didi

go - Go 中的接口(interface)层次结构

转载 作者:数据小太阳 更新时间:2023-10-29 03:14:40 27 4
gpt4 key购买 nike

我有一个程序使用了多种类型的模块,但所有不同类型的模块都共享某些方法。我正在尝试构建一个可以为不同类型的模块重用的通用工厂,但我缺少接口(interface)继承之类的东西,或者在 Go 中会调用它。

这是我试图尽可能简化的示例:

有一个使用通用模块接口(interface)的通用工厂:

package main

var (
modules []Module
)

type Module interface {
RegisterFlagSet()
GetName() (string)
}

type Factory struct {
instances []Module
}

func RegisterModules(modules []Module) {
modules = modules
}

func (f *Factory) registerFlagSets() {
for _,inst := range f.instances {
inst.RegisterFlagSet()
}
}

func (f *Factory) GetInstance(seek string)(Module) {
for _,inst := range f.instances {
if (inst.GetName() == seek) {
return inst
}
}
panic("cannot find module")
}

然后是模块类型 Timer 的更具体的实现。我正在尝试尽可能多地重用工厂:

package main

import (
"time"
)

var (
timer_modules = []Timer{
// list all the timer modules here
}
)

type Timer interface {
Module
GetTicker() (*time.Ticker)
}

type TimerFactory struct {
Factory
}

func NewTimerFactory() TimerFactory {
tfact := TimerFactory{}
RegisterModules(timer_modules)
return tfact
}

当我尝试构建时出现此错误:

timer_factory.go:25: cannot use timer_modules (type []Timer) as type []Module in argument to RegisterModules

我不明白为什么 type []Timer 的变量不能用作 type []Module 因为接口(interface) Module< 的所有方法 也在接口(interface) Timer 中,所以它们应该兼容还是不兼容?有没有办法让它们兼容?

最佳答案

https://golang.org/doc/faq#convert_slice_of_interface给出解释。解决方法之一是实现一个新的寄存器函数:

func RegisterModule(m Module) {
modules = append(modules, m)
}

并以仅多两行为代价在一个范围内调用该函数:

func NewTimerFactory() TimerFactory {
tfact := TimerFactory{}
for _, t := range timer_modules {
RegisterModule(t)
}
return tfact
}

关于go - Go 中的接口(interface)层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39943369/

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