写点什么

Go 语言开发小技巧 & 易错点 100 例(六)

作者:海风极客
  • 2023-05-01
    河北
  • 本文字数:1656 字

    阅读完需:约 5 分钟

往期回顾:



本期看点(技巧类用【技】表示,易错点用【易】表示)


  • Go 打印日志到文件【技】

  • recover 方式的异常处理【易】

  • Go HTTP 请求重定向【技】


正文开始:

Go 打印日志到文件

打印日志的意义在于记录程序运行过程中的各种信息和事件,以便在程序出现问题时能够更快地定位和解决问题。日志可以记录程序的输入、输出、异常、错误、性能指标等信息,帮助开发人员和运维人员快速发现问题,进行调试和优化。此外,日志还能为程序运行提供审计和监控的功能,方便对程序的运行情况进行分析和评估。因此,打印日志是程序开发和维护中非常重要的一项工作。


而有时候我们在自己调试的时候可以使用控制台进行灵活的打印,但是如果到了线上的生产环境,光有控制台打印往往是不够的,需要通过文件持久化才方便在需要排查问题时进行随时查看。以下就是 Go 语言将日志输出到文件的代码案例:


import (   "io"   "log"   "os"   "testing")
func TestPrintLogToFile(t *testing.T) { f, err := os.OpenFile("log.log", os.O_CREATE|os.O_APPEND|os.O_RDWR, os.ModePerm) if err != nil { return } defer func() { f.Close() }()
multiWriter := io.MultiWriter(os.Stdout, f) log.SetOutput(multiWriter)
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
log.Println("log1") log.Print("log222") log.Printf("line%d \n", 171)}
复制代码

recover 方式的异常处理

在 Go 语言中没有异常类型,只有错误类型(Error),异常往往是不可控的,可能随时都会发生,而错误一般都是由自己进行定义:


  • 错误:指的是可能出现问题的地方出现了问题,比如打开一个文件时失败,这种情况在人们的意料之中 ;

  • 异常:指的是不应该出现问题的地方出现了问题,比如引用了空指针,这种情况在人们的意料之外。


Go 语言中虽然没有异常的概念,但是却有更为恐怖的 panic ,由于有了 recover,在一定程度上, panic 可以类比做异常,在我们可能预想到的错误中可以进行灵活的处理,但是一旦程序中发生无法预料到的异常,则需要进行 recover,以下就是在程序发生异常时的处理方式:


func TestPanic(t *testing.T) {  defer func() {    if err := recover(); err != nil {      fmt.Println(err)      fmt.Println("发生panic后...")    }  }()  fmt.Println("发生panic前...")  panic("panic 啦 ~~~")}
复制代码


运行结果:



如果不使用 recover:


func TestPanic(t *testing.T) {  //defer func() {    //if err := recover(); err != nil {    //fmt.Println(err)    //}  //}()  fmt.Println("发生panic前...")  panic("panic 啦 ~~~")  fmt.Println("发生panic后...")}
复制代码


运行结果:


Go HTTP 请求重定向

HTTP 请求重定向是一个非常常见的 HTTP 操作,主要逻辑如下:



方式一:


func login(w http.ResponseWriter, r *http.Request) {  w.Header().Set("Cache-Control", "must-revalidate, no-store")  w.Header().Set("Content-Type", " text/html;charset=UTF-8")  w.Header().Set("Location", "http://www.baidu.com/") //跳转地址设置  w.WriteHeader(http.StatusFound)                                  }
func TestResponseHeader(t *testing.T) { http.HandleFunc("/", login) if err := http.ListenAndServe(":8080");err!= nil { log.Fatal("ListenAndServe: ", err) }}
复制代码


方式二:


func login(w http.ResponseWriter, r *http.Request) {  w.Redirect(http.StatusFound, "http://www.baidu.com/")                             }
func TestResponseHeader(t *testing.T) { http.HandleFunc("/", login) if err := http.ListenAndServe(":8080");err!= nil { log.Fatal("ListenAndServe: ", err) }}
复制代码


本期到此结束~

发布于: 刚刚阅读数: 3
用户头像

海风极客

关注

做兴趣使然的Hero 2021-01-14 加入

Just do it.

评论

发布
暂无评论
Go语言开发小技巧&易错点100例(六)_三周年连更_海风极客_InfoQ写作社区