登录
首页 >  Golang >  Go问答

多个接口的相同结构

来源:stackoverflow

时间:2024-03-18 18:45:29 452浏览 收藏

在 Go 中,为同一结构体创建多个接口变体是一种常见且推荐的做法,特别是当不同的消费者只关心结构体不同方法的子集时。这种方法提供了灵活性,允许每个消费者使用他们需要的特定接口,从而避免不必要的代码耦合和重复。它还与 Go 的接口机制相一致,该机制强调通过实现特定接口来定义类型的能力。

问题内容

我正在学习 go,并想知道在某些情况下,在 golang 中为相同的 struct 创建多个 interface 变体是否被认为是好的/好的/典型(鼓励?)实践,具体取决于消费者代码将如何处理该结构?

我对此提出疑问,因为我有一个结构对象,可以说它在我的代码库中做了太多事情,并且我想添加一些测试并仅模拟该结构的某些用法/使用者。说我有,

对于(人为的)示例,环境结构

// environment/env.go

package env

type environment struct {
  sunny bool,
  fullmoon bool,
  temp float64
  // ...
}

func (e *environment) issunny() bool {
  return e.sunny
}

func (e *environment) isfullmoon() bool {
  return e.fullmoon
}

func (e *environment) gettemp() float64 {
  return e.temp
}

上面的结构体具有与一些环境条件(白天和夜间)相关的属性和方法。

然后这个结构体有多个使用者,但是每个 interface 只关心可用方法的子集:

// daytime.go

type dayenv interface {
  issunny() bool
  gettemp() float64
}

func getdaytime(de dayenv) {
  sunstatus := getsunstatus(de)
  temp      := getdaytemp(de)

  fmt.printf("today is %s and temperature is %s", sunstatus, temp)
}

// func getsunstatus(de dayenv) string {}
// func getdaytemp(de dayenv) string {}
// nightTime.go

type NightEnv interface {
  IsFullMoon() bool
  GetTemp() float64
}


func getNighttime(ne NightEnv) {
  moonPhase := getMoonPhase(ne)
  temp      := getNightTemp(ne)

  fmt.Printf("Tonight the moon is %s and temperature is %s", moonPhase, temp)
}

// func getMoonPhase(ne NightEnv) string { }
// func getNightTemp(ne NightEnv) string { }

在我看来,虽然创建一个只关心结构方法子集的新接口使事情变得更加灵活,但拥有如此多(部分)重复的接口并将它们散布为也感觉相当懒惰或错误。需要或在任何地方消费。我意识到这个例子有点做作,但在更大的范围内(就像很多很多消费者),或者也许一个文件具有同一结构的 x 接口......这种方法有什么问题吗?


解决方案


这种方法没有任何问题,Go 标准库也经常使用它。例如,有许多结构体实现了 io.Reader、io.Writer、io.Closer 和 io.Seeker 的组合。这些结构的用户指定他们需要什么类型的接口并使用它。

接口是golang实现“多态”的必备部分。你不但做对了,还找到了界面的本质。

今天关于《多个接口的相同结构》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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