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

news2025/2/27 8:32:21

往期回顾:

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

运行结果:

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

如果不使用recover:

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

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

本期到此结束~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/412840.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序开发-云开发降低资源调用次数

问题 微信小程序云开发是很方便,减少了后端的大量工作,但是! 流量主的一点广告费,一不小心就全被腾讯薅走了!当然一种办法就是使用云服务器自建后端,也要付费,没有对比过,不知道各…

如何在移动应用中集成美颜SDK实现人脸识别和美化功能?

随着移动应用的普及和人们对美的追求,美颜功能已成为很多应用的必备功能。而为了实现这样的功能,开发者需要使用美颜SDK。本文将从以下几个方面介绍如何在移动应用中集成美颜SDK实现人脸识别和美化功能。 一、美颜SDK的介绍 美颜SDK是一种用于美化人脸的…

应用程序接口(API)安全的入门指南

本文简单回顾了 API 的发展历史,其基本概念、功能、相关协议、以及使用场景,重点讨论了与之相关的不同安全要素、威胁、认证方法、以及十二项优秀实践。 根据有记录的历史,随着 Salesforce 的销售自动化解决方案的推出,首个 We…

缩短客户响应时间的 5 种方法

在当今竞争激烈的世界中,客户服务就是确保卓越的客户体验。这意味着顶级品牌必须竞争为客户提供最好的客户服务,而且提供最快的响应时间。 改善客户服务响应时间的 5种方法 1.使用正确的客户服务软件 客户服务软件是您可以为提高客户服务而进行的最佳投资…

手写Spring框架-前奏-注解与自定义注解

目录 注解 介绍 功能 分类 注解处理器类库 自定义注解 常用元注解 自定义 注解 介绍 提供一种为程序元素设置元数据的方法用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联元数据是指数据的…

游戏工厂:AICG/ChatGPT与流程式游戏开发(码客 卢益贵)

关键词:AI(AICG、ChatGPT、文心一言)、流程式管理、好莱坞电影流程、电影工厂、游戏工厂、游戏开发流程、游戏架构、模块化开发 一、前言 开发周期长、人工成本高、成功率低等是游戏公司融资困难的罪因。所以有的公司凭一个爆款游戏一骑绝尘…

【MySQL】MySQL索引优化——从原理分析到实践对比

目录 使用TRACE分析MySQL优化 开启TRACE TRACE 结果集 ORDER BY & GROUP BY 优化 优化方式 分页优化 不同场景的优化方式 JOIN关联优化 算法介绍 优化方式 COUNT优化 优化方式 使用TRACE分析MySQL优化 某些情况下,MySQL是否走索引是不确定的[,,_,,…

给word文档中的公式标号

给word文档中的公式标号 首先编写一个公式 cosθa2b2−c22abcos\theta\frac{a^2b^2-c^2}{2ab} cosθ2aba2b2−c2​ 在公式的最后(不要超出公式块)输入#()并按回车: 即可在生成的框中输入公式序号:

Sobel 算子

1、简介 SobelSobelSobel 本质是基于图像空间域卷积,卷积的作用除了实现图像模糊或者去噪,还可以寻找一张图像上所有梯度信息,这些梯度信息是图像的最原始特征数据,进一步处理之后就可以生成一些比较高级的特征用来表示一张图像实…

快速搭建第一个SpringCloud程序

目录 1、Spring Boot项目脚手架快速搭建 1.1 生成工程基本配置 1.2 生成工程。 1.3 导入开发工具(此处为Idea) 1.4 运行代码 1.5 验证是否能访问 2、Spring Cloud环境搭建 2.1 版本匹配问题 2.2 Spring Cloud环境测试 3、引入Eureka Server 3…

《GPT-4技术报告》【中文版、英文版下载】

大预言模型时代已经到来,但是真正的智能之路还很长。 一、以下是连接,大家请自取。 英文原版:https://arxiv.org/pdf/2303.08774.pdfhttps://arxiv.org/pdf/2303.08774.pdf 中文翻译版本: 人工通用智能的星星之火:GPT-4的早期实…

【Linux】vi编辑器——命令模式

目录 行复制( "yy") 示例: 结果: 粘贴 多行复制("nyy") 示例: 结果: 行间跳转 1G或gg-------------------跳转到文本内容的第一行 示例: 结果: G-----------…

刷题日记①

day01 1. %m.ns 打印输出 以下程序的运行结果是&#xff08;&#xff09;_表示空格 #include <stdio.h> int main(void) {printf("%s , %5.3s\n", "computer", "computer");return 0; }A computer , puter B computer , __com C compute…

磁共振成像(MRI)连接组学的应用

前言 如何将磁共振成像(MRI)连接组学应用于研究典型的大脑结构和功能&#xff0c;并在临床环境中用于诊断、预后或治疗&#xff1f;本文将讨论MRI连接组学在评估功能和结构连接方面的可能应用。简而言之&#xff0c;功能连接是一种测量功能磁共振(fMRI)衍生的血氧水平依赖(BOL…

好兄弟离职了,一周面试了20多场,我直呼内行

好兄弟离职之后&#xff0c;一周面试了20多场&#xff0c;最后进了阿里&#xff0c;分享一些面试经历&#xff0c;希望能对大家有帮助&#xff01; 我的面试感受 先说一个字 是真的 “ 累 ” 安排的太满的后果可能就是经常一天只吃一顿饭&#xff0c;一直奔波在路上 不扯这个…

MybatisPlus <= 3.5.3.1 TenantPlugin 组件 存在 sql 注入漏洞(CVE-2023-25330)

漏洞描述 MyBatis-Plus TenantPlugin 是 MyBatis-Plus 的一个为多租户场景而设计的插件&#xff0c;可以在 SQL 中自动添加租户 ID 来实现数据隔离功能。 MyBatis-Plus TenantPlugin 3.5.3.1及之前版本由于 TenantHandler#getTenantId 方法在构造 SQL 表达式时默认情况下未对…

关键词数据分析-搜索词和关键词分析工具

要搜索热门关键词获取&#xff0c;可以采用以下几种方法&#xff1a; 使用百度指数&#xff1a;百度指数是一个实用的工具&#xff0c;可用于查看关键词的热度趋势、搜索量等数据。在百度指数中&#xff0c;您可以输入您要搜索的关键词&#xff0c;并查看近期的相关数据。这可以…

ServletAPI详解(四)-HttpServletResponse

我们来看第三个方法,HttpServletResponse 在servlet运行原理中提到,servlet代码中的doXXX方法的目的就是根据请求计算响应,然后将响应数据设置到HttpServletResponse对象中,然后 Tomcat 就会把这个 HttpServletResponse 对象按照 HTTP 协议的格式, 转成一个字符串, 并通过 Soc…

golang硬核技术(一)内存管理

目录前言tcmallocPageHeapCentralCacheThreadCache小对象分配中对象和大对象总结堆内存分配概念mheapheaparenamspanmcentralmcache微对象分配 tiny allocator小对象分配大对象分配栈内存分配分段栈连续栈栈在go中stackpoolstackLarge栈分配栈缩容前言 golang的内存分配&#…

QT学习笔记( APP 主界面开发项目\滑动界面的设计)

APP 主界面开发项目 本章与大家一起开发 APP 主界面。Qt C提供了像 QStackedWdget 与 QTableView 这种控 件可以方便的切换页面&#xff0c;但是这种切换页面的方法比较生硬&#xff0c;不能像手机一样滑动&#xff0c;往往这种 界面就会给用户较差的体验感。所以在传统的 Qt …