不能使用ResponseErrorWriter文字(类型ResponseErrorWriter)作为GO中的类型错误

时间:2016-05-17 06:22:58

标签: go

在我的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框架的新手。

2 个答案:

答案 0 :(得分:1)

从邮件中,ResponseErrorWriter不是tigertonic.ErrorWriter。这意味着你没有创建实现接口type ResponseErrorWriter struct的{​​{1}},所以你要做的是初始化一个与预期接口不匹配的结构。

消息很明确,您需要实现tigertonic.ErrorWriter方法。

答案 1 :(得分:1)

您的问题依赖于原始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,这意味着它的类型是一个自定义类型,它实现了在接口内声明的方法。这意味着您必须实现声明为interface的方法。

接口定义了一组方法(方法集),但这些方法不包含代码:它们未实现(它们是抽象的)。 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)
    }
}

唯一遗留的是将本地struct变量定义为:

type defaultErrorWriter struct{}