Error handling 如何指定和处理Go中的特定错误?

Error handling 如何指定和处理Go中的特定错误?,error-handling,go,Error Handling,Go,我编写了这个非常基本的解析器,它通过RedditJSON进行分析,我很好奇如何专门管理Go中的错误 例如,我有一个链接的“Get”方法: func Get(reddit string) ([]Item, error) { url := fmt.Sprintf("http://reddit.com/r/%s.json", reddit) resp, err := http.Get(url) if err != nil { return nil, err

我编写了这个非常基本的解析器,它通过RedditJSON进行分析,我很好奇如何专门管理Go中的错误

例如,我有一个链接的“Get”方法:

func Get(reddit string) ([]Item, error) {
    url := fmt.Sprintf("http://reddit.com/r/%s.json", reddit)
    resp, err := http.Get(url)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    if resp.StatusCode != http.StatusOK {
        return nil, err
    }
    /*
     * Other code here
    */
}
比如说,我如何处理来自状态码的404错误?我知道我可以测试404错误本身:

if resp.StatusCode == http.StatusNotfound {
    //do stuff here
}
但是有没有办法直接管理
resp.StatusCode!=http.StatusOK
而不必编写一堆if语句?有没有一种方法可以在switch语句中使用
err

首先请注意,对于不是200的HTTP返回,不会返回错误。即使服务器给它一个404错误,Get也成功地完成了它的工作。从文件中

非2xx响应不会导致错误

因此,在您的代码中,
err
在调用此函数时将为
nil
,这意味着它将返回
err=nil
,这可能不是您想要的

if resp.StatusCode != http.StatusOK {
    return nil, err
}
这应该是你想要的

if resp.StatusCode != http.StatusOK {
    return nil, fmt.Errorf("HTTP Error %d: %s", resp.StatusCode, resp.Status)
}
对于任何类型的HTTP错误,它都会返回一个错误,并显示一条关于错误内容的消息。

确定您可以:

package main

import "fmt"

func main() {
    var err error
    switch err {
    case nil:
        fmt.Println("Is nil")
    }
}