登录
首页 >  Golang >  Go问答

使用子包构建 go 接口

来源:stackoverflow

时间:2024-04-10 10:09:35 384浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《使用子包构建 go 接口》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

我正在开发我的第一个真正的 go 应用程序,并试图将我的手放在应该结构化的代码文件上。

我的代码的主要部分将是许多类型,它们都实现一个公共接口。

type runner interface {
  run() string
}

它们将被装在一个包裹中。由于接口实现的数量将会非常大,我想将它们(语义上)分成几个子包。

runner/
  blue/
  red/

runner 实现需要访问在我的应用程序中其他地方定义的几个其他接口(例如,cachesecret)。这些目前是在单独的包中定义和实现的。我的计划是使用 config 结构,其中包含所有这些实用程序接口并将其传递给 runner 实现。

我不确定如何最好地处理这些子包以及将 config 和接口声明放在哪里。 我的直观方法是在 runner 包中定义 config 结构和 runner 接口,并仅从那里返回 []runner 集合,但这违反了此建议。 此外,所需的导入数量以及遇到禁止的循环引用的危险让我感觉我的解决方案违背了最佳实践。

对于如何改进我的代码结构有什么建议吗? 添加包含所有接口定义和 config 结构的 common 包是否可取?


正确答案


我最终创建了一个包含接口和 config 定义的 domain 包。

所以在 domain/domain.go 中我有

package domain


type config struct {
    cache
}

type runner interface {
  run() string
}

type cache interface {
  // ...
}

如上所述,运行程序以子包的形式构建。我不导出类型,而是在每个包中都有一个函数来收集所有类型并将其作为接口返回。

runner/blue/blue.go

package blue

import "my/domain"

func all(config domain.config) (list []domain.runner) {
    list = append(list, foorunner{config: config})
    list = append(list, barrunner{config: config})
    return
}

runner/runner.go

package runner

import ( 
  "my/runner/blue"
  "my/runner/red"
  "my/runner/domain"
)

func All(config domain.Config) (list []domain.Runner) {
    list = append(list, blue.All(config)...)
    list = append(list, red.All(config)...)
    return
}

今天关于《使用子包构建 go 接口》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>