我可以通过GO中的方法扩展错误接口吗?

C4d*_*C4d 1 extension-methods struct interface go

我和C#一起工作多年,所以我试图在GO中找到相似之处(我对此很新).

我的目标:
我想error通过一种方法来扩展接口,因为Check()我能够error.Check()通过(在我看来)更好的可读代码来调用.

我当前的状态:
我已经学习了如何使用这种语法通过方法扩展类型:

func (foo T) MyExtension() returnType {
    // return something
}
Run Code Online (Sandbox Code Playgroud)

我的问题:
看起来这只适用于类型而不适用于接口.正如我迄今所看到的errorinterface,这些会用来许多包来描述自己的错误类型的基础.我不想扩展这个错误类型(从包),而是想扩展接口以涵盖所有.我找不到任何语法.因为我也不知道这个的技术术语(它不是extension-method)我在谷歌搜索时有点迷失.

那么有没有办法error通过一般方法扩展接口?

icz*_*cza 5

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

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

从你想要的方法(Check())的名称来判断,最好是创建一个实用程序函数:

func check(err error) {
    if err != nil {
        panic(err) // Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

这种"模式"也可以应用于您自己的接口,它不会干扰现有的实现.