往期回忆:
- 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 啦 ~~~")
}
运转成果:
如果不运用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)
}
}
本期到此结束~