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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 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)
  }
}

本期到此结束~

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7天前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
24 2
|
5天前
|
Go 索引
go语言中的循环语句
【11月更文挑战第4天】
13 2
|
5天前
|
Go C++
go语言中的条件语句
【11月更文挑战第4天】
16 2
|
8天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
5天前
|
Go
go语言中的 跳转语句
【11月更文挑战第4天】
13 4
|
5天前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
18 1
|
7天前
|
Go 调度 开发者
探索Go语言中的并发模式:goroutine与channel
在本文中,我们将深入探讨Go语言中的核心并发特性——goroutine和channel。不同于传统的并发模型,Go语言的并发机制以其简洁性和高效性著称。本文将通过实际代码示例,展示如何利用goroutine实现轻量级的并发执行,以及如何通过channel安全地在goroutine之间传递数据。摘要部分将概述这些概念,并提示读者本文将提供哪些具体的技术洞见。
|
6月前
|
网络协议 Linux Go
分享一个go开发的工具-SNMP Server
分享一个go开发的工具-SNMP Server
147 0
|
6月前
|
搜索推荐 Linux Go
分享一个go开发的端口转发工具-port-forward
分享一个go开发的端口转发工具-port-forward
102 0
|
缓存 IDE 数据可视化
Go 日常开发常备第三方库和工具(中)
重点和大家分享下我们日常开发中所使用到的一些第三方库与工具。 这里我主要将这些库分为两类: 业务开发 基础工具开发