首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以用GO中的方法扩展错误接口吗?

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

Stack Overflow用户
提问于 2018-08-08 13:35:13
回答 2查看 942关注 0票数 2

我在C#上工作多年了,所以我试图在GO中寻找相似之处(我对此非常陌生)。

我的目标:

我希望通过像error这样的方法来扩展接口error.Check(),这样我就可以仅仅因为一段(在我看来)更好的可读性代码而调用error.Check()

我的当前状态:

我已经学习了如何使用以下语法通过方法扩展类型:

代码语言:javascript
复制
func (foo T) MyExtension() returnType {
    // return something
}

我的问题:

看起来这只适用于类型,而不适用于接口。正如我到目前为止所看到的,error是一个interface,许多包都使用它来描述它们自己的错误类型的基础。我不想扩展这种错误类型(从包中),而是希望扩展接口以涵盖所有这些错误类型。我找不到任何语法。因为我也不知道这个词的技术术语(它不是extension-method),我有点迷上谷歌了。

那么,是否有一种方法可以通过通用方法扩展error 接口?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-08 13:45:52

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

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

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

代码语言:javascript
复制
func check(err error) {
    if err != nil {
        panic(err) // Do something
    }
}

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

票数 5
EN

Stack Overflow用户

发布于 2018-08-08 13:47:09

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

代码语言:javascript
复制
if err != nil {
    log.Printf("Error received - [%v]",err)
    return err
}

因为戈朗没有尝试过C#熟悉的catch块。

如果您的方法Check()将返回bool,则仍然需要对照if语句检查它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51748103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档