为了账号安全,请及时绑定邮箱和手机立即绑定

使用子包构建 go 接口

使用子包构建 go 接口

Go
皈依舞 2022-12-05 16:48:56
我正在开发我的第一个真正的 go 应用程序,并试图将我的手放在应该结构化的代码文件上。我的代码的主要部分将是一些类型,它们都实现了一个公共接口。type Runner interface {   Run() string}他们将被打包。由于接口实现的数量将非常大,我想将它们(语义上)拆分为几个子包。runner/   blue/   red/该Runner实现需要访问在我的应用程序中别处定义的几个其他接口(例如,Cache和Secret)。这些目前在单独的包中定义和实现。我的计划是使用一个Config结构,它包含所有这些实用程序接口并将其传递给Runner实现。我不确定如何最好地处理这些子包以及在哪里放置Config和接口声明。我的直觉方法是在包中同时定义Config结构和Runner接口,runner并且只从那里返回一个[]Runner集合,但这违反了这个建议。此外,所需的导入数量和遇到被禁止的循环引用的危险让我觉得,我的解决方案违背了最佳实践。有什么建议可以改进我的代码结构吗?添加一个common包含我所有接口定义和Config结构的包是否可取?
查看完整描述

1 回答

?
四季花海

TA贡献1811条经验 获得超5个赞


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


所以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

}


查看完整回答
反对 回复 2022-12-05
  • 1 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号