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