登录
首页 >  Golang >  Go问答

如何在避免循环依赖的情况下高效地重用 Go 接口

来源:stackoverflow

时间:2024-02-08 11:30:23 255浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《如何在避免循环依赖的情况下高效地重用 Go 接口》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我有一个简单的包声明,其中包“a”定义了接口“a”,但我需要使用包“b”中的接口进行类型推断,然后在 dorequest() 中实现 b.request() 为“a”,这意味着必须以循环方式导入包。

我的问题是,这种设计是否有一种简单的方法可以避免编译器循环依赖错误?

注意避免将“a”和“b”放在同一个包中

package b

import "a"

func request(t a.a){
m := t.getmethod()
payload := t.getpayload()
}

和包“a”声明

package a

import "b"


type A interface {
 GetMethod () string
 GetPayload () string
}

type ImplementA struct {
}

func (imp ImplementA)GetMethod() string{
return ""
}

func (imp  ImplementA) GetPayload() string{
return ""
}

func (imp ImplementA) DoRequest(){
  b.Request(imp)
}

正确答案


在 go 中定义使用它们的接口被认为是最佳实践。因此,在 package b 中,使用 package b 中的函数所需的方法定义一个接口。

您仍然可以在 包 a 中添加其他函数。如果您还需要在 package a 中定义接口,则可以嵌入 package b 中的接口。

例如:

package b

type ainterface interface {
  getmethod () string
  getpayload () string
}

func request(t ainterface) {
  m := t.getmethod()
  payload := t.getpayload()
}

那么包 a 将只包含实现。

package a

import "b"

type ImplementA struct {
}

func (imp ImplementA) GetMethod() string {
  return ""
}

func (imp ImplementA) GetPayload() string {
  return ""
}

func (imp ImplementA) DoRequest() {
  b.Request(imp)
}

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何在避免循环依赖的情况下高效地重用 Go 接口》文章吧,也可关注golang学习网公众号了解相关技术文章。

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