August 2021
Beginner to intermediate
450 pages
6h 1m
Chinese
findLinks示例使用http.Get的输出作为html.Parse的输入。如果请求的URL是HTML那么它一定会正常工作,但是许多页面包含图片、文字和其他文件格式。如果让HTML解析器去解析这类文件可能会发生意料外的状况。
下面的程序获取一个HTML文档然后输出它的标题。title函数检测从服务器端回的Content-Type头部,如果文档不是HTML则返回错误。
下面是稍稍编辑后的命令行会话示例:
观察重复的resp.Body.Close()调用,它保证title函数在任何执行路径下都会关闭网络连接,包括发生错误的情况。随着函数变得越来越复杂,并且需要处理更多的错误情况,这样一种重复的清理动作会造成之后的维护问题。我们看看Go语言的defer机制怎样让这些工作变得更简单。
语法上,一个defer语句就是一个普通的函数或方法调用,在调用之前加上关键字defer。函数和参数表达式会在语句执行时求值,但是无论是正常情况下,执行return语句或函数执行完毕,还是不正常的情况下,比如发生宕机,实际的调用推迟到包含defer语句的函数结束后才执行。defer语句没有限制使用次数;执行的时候以调用defer语句顺序的倒序进行。 ...