Go语言圣经 - 第5章 函数 - 5.8 Defered函数

本文深入探讨Go语言中的defer语句,它用于简化资源管理,特别是打开与关闭、连接与断开等操作。defer使得在函数退出时确保某些代码执行,无论函数如何结束。文中通过实例解释了defer的工作原理,展示了其在处理HTTP响应、文件操作和互斥锁中的应用,并提到了在循环中使用defer的注意事项。
摘要由CSDN通过智能技术生成

第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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值