golang runtime error

今天利用go写了一段代码, 用来获取网页的内容并写入到文件中,编译无异常, 但是偶尔运行会报出runtime error.代码如下

 // panic: runtime error: invalid memory address or nil pointer dereference
 // [signal 0xc0000005 code=0x0 addr=0x40 pc=0x5e410e]
 func fetch(url string, i int){
     resp, err := http.Get(url)
     body, err := ioutil.ReadAll(resp.Body)

     defer resp.Body.Close()

     if err != nil{
         fmt.Println(err)
     }

     filepath := strings.Split(url, ".")
     filename := "sites/" + filepath[len(filepath) - 2] +strconv.Itoa(i)+ ".html"
     fmt.Println(filename)

     if ioutil.WriteFile(filename, body, os.ModeExclusive) != nil{
         fmt.Println("写入文件失败")
     }
 }

通过谷歌,大概找到了问题,根据stackoverflow上面的回答。问题是这么产生的, http.Get()方法在err等于nil的时候, 总是返回一个非空的resp.Body, resp是指针, 当err不是nil的时候, resp.Body不存在,因此导致下一行使用resp.Body的时候产生了空指针错误。

当我在查找问题的时候, 还看到了另外一种导致这种错误的代码。源代码, 这个问题的产生是由于同名的局部变量覆盖了对全局变量的访问。这应该是很基础的问题, 主要是对语言的基础理解不深。