前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言开发小技巧&易错点100例(六)

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

原创
作者头像
海风极客
发布2023-09-29 21:12:23
1690
发布2023-09-29 21:12:23
举报
文章被收录于专栏:扯编程的淡扯编程的淡

Go打印日志到文件

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

而有时候我们在自己调试的时候可以使用控制台进行灵活的打印,但是如果到了线上的生产环境,光有控制台打印往往是不够的,需要通过文件持久化才方便在需要排查问题时进行随时查看。以下就是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,以下就是在程序发生异常时的处理方式:

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

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x2ryJpnL-1681004377422)(Go语言开发小技巧&易错点100例(六).assets/image-20230405102040541.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x2ryJpnL-1681004377422)(Go语言开发小技巧&易错点100例(六).assets/image-20230405102040541.png)]

如果不使用recover:

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

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vM1JSfL1-1681004377424)(Go语言开发小技巧&易错点100例(六).assets/image-20230405102223642.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vM1JSfL1-1681004377424)(Go语言开发小技巧&易错点100例(六).assets/image-20230405102223642.png)]

Go HTTP请求重定向

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

在这里插入图片描述
在这里插入图片描述

方式一:

代码语言:go
复制
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)
	}
}

方式二:

代码语言:go
复制
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)
	}
}

本期到此结束~

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Go打印日志到文件
    • recover方式的异常处理
      • Go HTTP请求重定向
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com