【问题标题】:cannot use ResponseErrorWriter literal (type ResponseErrorWriter) as type error in GO不能使用 ResponseErrorWriter 文字(类型 ResponseErrorWriter)作为 GO 中的类型错误
【发布时间】:2016-05-17 06:22:57
【问题描述】:

在我的 GO 项目中,server.go 文件中出现错误,

mygo/testkit/pkg/http/server pkg\http\server\server.go:24:不能使用 ResponseErrorWriter 文字(类型 ResponseErrorWriter)作为类型

tigertonic.ErrorWriter 在赋值: ResponseErrorWriter 没有实现tigertonic.ErrorWriter(缺少WriteError 方法)

这是我的init() 函数,它给出了server.go 中的错误。

func init() {
    tt.ResponseErrorWriter = ResponseErrorWriter{}
    tt.SnakeCaseHTTPEquivErrors = false // Ignored in ResponseErrorWriter anyway.
}

我在这一行得到了错误,

tt.ResponseErrorWriter = ResponseErrorWriter{}

此错误的原因是什么?如何解决这个问题?我是这个 GO 框架的新手。

【问题讨论】:

    标签: go


    【解决方案1】:

    从消息中,ResponseErrorWriter 不是tigertonic.ErrorWriter。这意味着您还没有创建实现接口tigertonic.ErrorWritertype ResponseErrorWriter struct,因此您要做的是初始化一个与预期接口不匹配的结构。

    消息很清楚,需要实现WriteError方法。

    【讨论】:

    • 我已经通过 import ( tt "github.com/rcrowley/go-tigertonic" ) 导入了go-tigertonic 然后我在init() 中初始化ResponceErrorWriter 比如tt.ResponseErrorWriter = ResponseErrorWriter{} 那么我应该在哪里实现WriteError
    • 你是否创建了一个 ErrorResponseWriter 结构体?
    【解决方案2】:

    您的问题依赖于原始source code 中的以下行:

    var ResponseErrorWriter ErrorWriter = defaultErrorWriter{}
    
    type ErrorWriter interface {
        WriteError(r *http.Request, w http.ResponseWriter, err error)
        WriteJSONError(w http.ResponseWriter, err error)
        WritePlaintextError(w http.ResponseWriter, err error)
    }
    

    分析上面的代码,很明显ResponseErrorWriter被定义为ErrorWriter,这意味着它的类型是一个自定义类型,它实现了接口内部声明的方法。这意味着您必须实现声明为接口的方法。

    接口定义了一组方法(方法集),但这些方法不包含代码:它们没有实现(它们是抽象的)。 Go 中的接口是结构和它们需要实现的方法之间的某种契约。


    如果你真的需要实现你的ErrorWriter接口,你需要声明你的自定义结构,它实现了原始ErrorWriter接口中定义的方法。然后你需要调用声明的方法。你想如何处理错误这一切都取决于你。

    如果您检查源代码,您会发现它是通过以下方式实现的:

    func (d defaultErrorWriter) WriteError(r *http.Request, w http.ResponseWriter, err error) {
        if acceptJSON(r) {
            d.WriteJSONError(w, err)
        } else {
            d.WritePlaintextError(w, err)
        }
    }
    

    唯一剩下的就是将局部结构变量定义为:

    type defaultErrorWriter struct{}
    

    【讨论】:

    • 那么我应该在哪里实现ErrorWriter
    • 有一个默认的ErrorWriter。如果您不想以特定方式编写它们,则可以使用默认值,就可以了。为了了解它是如何写错误的,你可以在这里查看这个默认ErrorWriter的源代码github.com/rcrowley/go-tigertonic/blob/master/error.go#L80
    • 为什么需要覆盖原代码中的ErrorWriter?你对此有什么真正的论据吗?如果没有,你可以使用默认的ErrorWriter 就好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2023-01-20
    • 1970-01-01
    • 2022-08-04
    相关资源
    最近更新 更多