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

本期到此结束~

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
10月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
675 4
|
12月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
1187 0
|
10月前
|
JavaScript 前端开发 Java
【GoWails】Go做桌面应用开发?本篇文章带你上手Wails框架!一步步带你玩明白前后端双端的数据绑定!
wails是一个可以让你使用Go和Web技术编写桌面应用的项目 可以将它看作Go的快并且轻量级的Electron替代品。可以使用Go的功能,并结合现代化UI完成桌面应用程序的开发
1624 5
|
10月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
451 2
|
12月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
681 1
|
12月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
671 0
|
12月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
496 0
|
12月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
524 0
|
12月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
983 0
|
网络协议 Linux Go
分享一个go开发的工具-SNMP Server
分享一个go开发的工具-SNMP Server
592 0

热门文章

最新文章