【问题标题】:avoid implicit satisfaction避免隐含的满足
【发布时间】:2021-02-06 15:08:24
【问题描述】:

如何避免 Go 中的隐式转换?

例如:

type runner interface {
    run()
}

type person struct {
}

type program struct {
}

func (p person) run()  {}
func (p program) run() {}

如果我的跑步者的意图只是为了人而不是程序? 如您所知,人和程序都实现(满足)运行器接口。

【问题讨论】:

  • runner 添加另一个“标记”方法,例如implementsRunner()。见What is the idiomatic way in Go to create a complex hierarchy of structs?
  • 关于术语的说明:Go 根本不进行类型转换,无论是隐式的还是其他的。
  • Erm... 这有点违背了 go 的接口系统的意义,这个例子是一个假设,但是如果你的 runner 类型类似于 java 的可运行接口,那么肯定会有其他的区分两者的方法。程序必须有 IO,而 "runner" 可能只是一个线程(例程),它要么不通信,要么使用通道或其他任何东西。
  • 一个可以帮助您区分的问题:这两种方法都没有返回值真的有意义吗?例如,当运行一个程序时,它可能会在完成时返回一个状态码。您可以为此状态代码创建自定义类型,以便无关的“运行”方法没有理由重叠。

标签: go


【解决方案1】:

没有隐式转换。两个结构都满足runner,所以两个结构都可以是那个接口。

如果您正在执行一些条件操作并且想要拆分personprogram,您始终可以实现一个只有person 会实现而program 不会实现的附加方法。如this (playground)

type runner interface {
    isRunner() bool
    run()
}

您可能希望看到这个GoByExample 页面,该页面链接到底部的一个很棒的blog post,描述了接口是什么以及如何使用它们。

【讨论】:

  • 谢谢,就是这样。在 Go 中编码,需要一种不同于其他语言的新思维方式;)
  • 是的,golang 中的界面肯定不同于其他一些更传统的方法。
猜你喜欢
  • 2010-10-16
  • 2011-02-01
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多