第5章 函数
函数可以让我们将一个语句序列打包成一个单元,然后可以从程序中其他地方多次调用,函数的机制可以让我们把一个大的工作分解成小任务。前面我们已经接触过函数,本章我们将讨论函数的更多特性
5.8 Defered函数
在findLinks例子中,我们用http.Get的输出作为html.Parse的输入.只有URL的内容的确是HTML格式的,html.Prase才可以正常工作,但是实际上,url指向内容很丰富,可以是图片、纯文本或其它。将这些格式的内容传递给html.Parse,会产生不良后果
下面的例子获取HTML页面,并输出HTML页面的标题,title函数会检查服务器返回的Content-Type字段,如果发现页面不是HTML,将终止函数运行,返回错误
func title(url string)error {
resp,err := http.Get(url)
if err != nil {
return err
}
ct := resp.Header.Get("Content-Type")
if ct 1!="text/html" && !strings.HasPrefix(ct,"text/html;"){
resp.Body.Close()
return fmt.Errorf("parsing %s as HTML:%v",url,err)
}
doc,err :=html.Parse(resp.Body)
resp.Body.Close()
if err != nil {
return fmt.Errorf("parsing %s as HTML:%v",url,err)
}
visitNode := func(n *html.Node) {
if n.Type == html.ElementNode && n.Data == "title"&&firstChild != nil{
fmt.Println(n.firstChild.Data)
}
}
for eachNode(doc,visitNode,nil)
return nil
}