【问题标题】:Can I extend the error-interface by a method in GO?我可以通过 GO 中的方法扩展错误接口吗?
【发布时间】:2018-08-08 13:35:13
【问题描述】:

我已经使用 C# 多年,所以我试图在 GO 中找到相似之处(我对此很陌生)。

我的目标:
我想通过Check() 之类的方法扩展接口error,这样我就可以调用error.Check(),只是因为(在我看来)可读性更好的代码。

我现在的状态:
我已经学会了如何通过使用这种语法的方法来扩展类型:

func (foo T) MyExtension() returnType {
    // return something
}

我的问题:
看起来这仅适用于类型而不适用于接口。正如我目前所见,error 是一个interface,许多包都使用它来描述它们自己的错误类型的基础。我不想扩展这个错误类型(来自包),而是想扩展接口以覆盖它们。我找不到任何语法。因为我也不知道这个的技术术语(不是extension-method),所以我在谷歌搜索时有点迷失了。

那么有没有办法通过通用的方法扩展error接口呢?

【问题讨论】:

  • 您不能动态地向接口添加方法。如果这是可能的,以前实现接口的类型将在运行时中断。你应该写一个函数func Check(err error)
  • 出于好奇:Check() 方法有什么作用?
  • @kostix 在第一步中,只需将errornil 进行比较,然后退出log.fatal()。后来我会计划如何最好地处理我的情况下的错误。一开始我只是想总结所有发生的错误。
  • 总结:这是一个坏主意,幸运的是它是可撤销的。

标签: go struct interface extension-methods


【解决方案1】:

你不能扩展error,它是一个内置的接口类型。

您可以通过简单地添加新方法来扩展您自己的接口类型。这首先是“危险的”,因为在 Go 中实现接口是隐式的:没有意图声明。这意味着如果你有一个MyError 接口,一些现有的类型可能已经实现了它并以此为基础。如果您向其中添加新方法,现有类型很可能不再实现它,这很可能会破坏现有代码(除非您添加该新方法的实现)。

从您想要的方法的名称(Check())来看,最好是创建一个实用函数:

func check(err error) {
    if err != nil {
        panic(err) // Do something
    }
}

这个“模式”也可以应用于你自己的接口,它不会干扰现有的实现。

【讨论】:

  • 是的,我已经有了那个实用功能。我不想停留在指向“错误”的话题上,而是在 GO 中进行编码的可能性。这个完全回答了我的问题。谢谢! :)
【解决方案2】:

我强烈建议使用随意的 if 语句进行错误检查。

if err != nil {
    log.Printf("Error received - [%v]",err)
    return err
}

因为 golang 没有 C# 熟悉的 try catch 块。

如果您的方法 Check() 将返回 bool - 您仍然需要根据 if 语句检查它。

【讨论】:

  • 我不会这样做。我会在 Check() 方法中测试 nil 的错误,然后返回或 log.fatal(..) 或类似的。我肯定不会在我的代码中重复这个 if 语句。
  • @C4u 你不需要返回任何东西。它只会检查错误。
  • 我还没说要返回something。我刚才说returning 的意思是让函数运行到它的末尾,即使没有返回对象。
  • 另外:这个问题不是代码风格的讨论。我非常喜欢编码。我只需要一个关于扩展接口的可能性的答案。其他一切对我来说都非常清楚。但是感谢您提供的信息。
猜你喜欢
  • 2011-02-15
  • 1970-01-01
  • 2011-11-21
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 2013-11-02
相关资源
最近更新 更多