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

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

往期回忆:

  • Go言语开发小技巧&易错点100例(一)
  • Go言语开发小技巧&易错点100例(二)
  • Go言语开发小技巧&易错点100例(三)
  • Go言语开发小技巧&易错点100例(四)
  • Go言语开发小技巧&易错点100例(五)

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

  • 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 啦 ~~~")
}

运转成果:

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

如果不运用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语言开发小技巧&易错点100例(六)

Go HTTP恳求重定向

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

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

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

本期到此结束~