go - 我可以通过 GO 中的方法扩展错误接口(interface)吗?

标签 go struct interface extension-methods

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

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

我目前的状态:
我已经学会了如何使用以下语法通过方法扩展类型:

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

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

那么有没有办法通过通用方法来扩展error接口(interface)呢?

最佳答案

您无法扩展error,它是内置接口(interface)类型。

您只需添加新方法即可扩展自己的接口(interface)类型。这首先是“危险的”,因为在 Go 中实现接口(interface)是隐式的:没有意图声明。这意味着如果您有 MyError 接口(interface),某些现有类型可能已经实现它并在此基础上构建。如果您向其中添加新方法,现有类型很可能不再实现它,这很可能会破坏现有代码(除非您添加该新方法的实现)。

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

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

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

关于go - 我可以通过 GO 中的方法扩展错误接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51748103/

相关文章:

docker - 关于 Golang 编译器的 docker 容器内的系统架构

c - 如何定义从文本文件扫描的行的结构最大大小

c - 类型转换的未定义行为?

c++ - 如何编写一个接受具有相同接口(interface)的不同类型参数的函数?

interface - TypeScript:跨文件合并接口(interface)

go - 如何解码嵌套的未知字段

Golang WaitGroup 超时错误处理

google-app-engine - slice 或 map 中元素的重新排序或打乱顺序 GAE Go

C# const 结构列表

java - 当需要接口(interface)时,我可以在 JRuby 中返回匿名闭包吗?