老师,为什么我明明是抛出userErrorActual的错误,为什么在处理HTTP响应时能够被userError断言成功?

来源:8-5 服务器统一出错处理2

ericdemon

2021-03-15

问题:

  • 这里有一个地方很不能理解,我明明是抛出userErrorActual的错误,为什么在处理HTTP响应时能够被userError断言成功?

根据课程视频中的代码逻辑:

  • 我定义了2个类型,一个是接口userError,另外一个是字符串userErrorActual
type userError interface {
	error
	Message() string
}

type userErrorActual string

func (e userErrorActual) Error() string {
	return e.Message()
}

func (e userErrorActual) Message() string {
	return string(e)
}
  • 然后我在处理请求路径时做了判断,判断如果不存在"/list/"子串的话就直接抛出userErrorActual
	if strings.Index(request.URL.Path, "/list/") != 0 {
		return userErrorActual("path must start with /list/")
	}
  • 并在返回HTTP响应时做对应的错误信息处理
	...
	if err != nil {
		...

		if userErr, userStatus := err.(userError); userStatus {
			fmt.Println(userErr, userStatus)
			http.Error(write, userErr.Message(), http.StatusBadRequest)
			return
		}

		switch {
			...
		}
		http.Error(write, http.StatusText(code), code)
	}
	...
写回答

1回答

ericdemon

提问者

2021-03-15

是因为userErrorActual类型正好都有与userError中相同的内容,所以也userErrorActual实现了userError接口吗。。

0
2
ccmouse
回复
ericdemon
基本正确。除了没有“组合接口”这样一说。那只是一个语法糖,相当于userError定义了Error()和Message()
2021-03-16
共2条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程