请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

问题:

  • 这里有一个地方很不能理解,我明明是抛出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)
	}
	...

正在回答 回答被采纳积分+3

1回答

提问者 ericdemon 2021-03-15 00:55:00

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

0 回复 有任何疑惑可以回复我~
  • 提问者 ericdemon #1
    我由重新理了一遍代码
    userErrorActual中的Error()方法是实现了error接口中的Error()方法
    userErrorActual中的Message()方法是实现了userError接口中的Message()方法
    而userError接口则是一个组合接口(error接口+Message()方法)
    
    不知道这样理解对不对。。。
    回复 有任何疑惑可以回复我~ 2021-03-15 01:02:27
  • ccmouse 回复 提问者 ericdemon #2
    基本正确。除了没有“组合接口”这样一说。那只是一个语法糖,相当于userError定义了Error()和Message()
    回复 有任何疑惑可以回复我~ 2021-03-16 09:54:42
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信