Go高质量编程与性能调优-学习笔记

news2025/7/10 19:17:50

1 高质量编程

1.1 简介

1.1.1 高质量代码

        高质量代码即正确可靠、简洁清晰的代码

1.1.2 编程原则

  • 简单性
  • 可读性
  • 生产力

1.2 编码规范

1.2.1 代码格式

        推荐gofmt自动格式化代码!

        推荐goimports实现gofmt+依赖包管理!

1.2.2 注释

  • 注释要解释代码作用、代码如何做的、代码实现的原因和代码什么情况会出错;
  • 公共符号始终要注释,包括包中声明的所有公共符号、既不明显也不简短的公共功能、库中的所有函数。但是,不需要注释实现接口的方法;

1.2.3 命名规范

变量:

  • 简洁胜于冗长;
  • 缩略词全大写,但当其位于变量开头且不需要导出时,使用全小写。例如ServeHTTP而不是ServeHttp,xmlHTTPRequest(不需要导出时)或XMLHTTPRequest(需要导出时);
  • 变量距离其被使用的地方越远,则需要携带越多的上下文信息。特别是全局变量需要更多的上下文信息使其在不同地方可以被轻松辨认其含义。

函数:

  • 函数名不携带包名的上下文信息,因为包名和函数名是成对出现的。比如http包中创建服务的函数命名为Serve而不是ServeHTTP;
  • 函数名尽量简短
  • 当名为foo的包中某个函数返回类型Foo时,可以省略类型信息而不导致歧义;
  • 当名为foo的包中某个函数返回类型T时(T不是Foo),可以在函数名中加入类型信息。

包:

  • 只由小写字母组成,不包含大写字母和下划线等字符;
  • 简短并包含一定的上下文信息,如schema、task;
  • 不要与标准库同名,如sync、strings等;
  • 尽量满足不使用常用变量名为包名,如使用bufio而不是buf;
  • 尽量满足使用单数而不是复数,如使用encoding而不是encodings;
  • 尽量满足谨慎缩写,如使用fmt在不破坏上下文的情况下比format更简短。

1.2.4 控制流程

  • 避免嵌套,保持正常流程清晰。如两个分支中都有return语句,则可以去除冗余的else;
  • 尽量保持正常代码路径为最小缩进。优先处理错误情况和特殊情况,尽早返回或继续循环来减少嵌套。如下面的例子:
不好的控制流程写法

好的控制流程

1.2.5 错误和异常处理

简单错误:

  • 简单的错误是指仅出现一次的错误,且在其他地方不需要捕获该错误
  • 优先使用errors.New来创建匿名变量来直接表示简单错误
  • 如果有格式化的需求,使用fmt.Errorf

        示例:

错误的Wrap和Unwrap:

  • 错误的Wrap就是error嵌套error形成error跟踪链
  • 在fmt.Errorf中使用%w关键字来将一个错误关联至错误链中

        示例:

错误判定:

  • 判定一个错误是否为特定错误,使用errors.Is;
  • 不同于使用==,使用该方法可以判定错误链上的所有错误是否含有特定的错误;
  • 在错误链上获取特定种类的错误,使用errors.As。

        示例:

panic:

  • 不建议在业务代码中使用panic;
  • 调用函数不包含recover会造成程序崩溃;
  • 若问题可以被解决,建议使用error代替panic;
  • 当程序启动阶段发生不可逆转的错误时,可以在init或main函数中使用panic。

recover:

  • recover只能在被defer的函数中使用
  • 嵌套无法生效
  • 只在当前goroutine生效

        示例:

         如果需要更多的上下文信息,可以recover后在log中记录当前的调用栈,如:

1.3 性能优化建议

1.3.1 Benchmark

go test -bench=. -benchmem

1.3.2 Slice

        在使用make()初始化切片时提供容量信息

        如果原切片较大,代码在原切片基础上新建小切片或原底层数组在内存中有引用,得不到释放,此时可使用copy来替代re-slice,示例如下:

1.3.3 Map

        在初始化时提供容量

1.3.4 字符串处理

        使用strings.Builder实现字符串拼接,示例:

 1.3.5 空结构体

        使用空结构体节省内存,可作为各种场景下的占位符使用,示例:

         实现集合时,会用到map,此时map的value类型设置为空结构体

1.3.6 atomic包

        硬件实现原子操作,比加锁要好。

        示例:

 

2 性能调优实战

2.1 简介

2.1.1 性能调优原则

  • 要依靠数据而不是猜测
  • 要定位最大瓶颈而不是细枝末节
  • 不要过早优化、过度优化

2.2 性能分析工具pprof

2.2.1 功能简介

2.2.2 排查实战

CPU:

        go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"

        命令:top,查看占用资源最多的函数

        结果含义:

        flat==cum: 该函数没有调用其它函数;

        flat==0:该函数只有其它函数的调用。

        命令:list,根据指定的正则表达式查找代码行

        命令:web,调用关系可视化,需要安装graphviz

堆内存:

        go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"

goroutine协程:

        go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"

mutex锁:

        go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"

block阻塞:

        go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"

2.2.3 采样过程和原理

CPU:

        采样对象是函数调用和它们占用的时间

Heap:

        采样程序通过内存分配器在堆上分配和释放的内存,记录分配、释放的大小和数量

Goroutine&ThreadCreate:

        记录所有用户发起且在运行中的goroutine

        记录程序创建的所有系统线程的信息

Block&Mutex:

        采样阻塞操作的次数好耗时,阻塞超过阈值才会记录

        采样争抢锁的次数和耗时

2.3 性能调优案例

2.3.1 业务服务优化

  • 建立服务性能评估手段
  • 分析性能数据,定位性能瓶颈
  • 重点优化项改造
  • 优化效果验证

2.3.2 基础库优化

AB实验SDK的优化:

  • 分析基础库核心逻辑和性能瓶颈
  • 内部压测验证
  • 推广业务服务落地验证

2.3.3 Go语言优化

编译器&运行时优化:

  • 优化内存分配策略
  • 优化代码编译流程,生成更高效的程序
  • 内部压测验证
  • 推广业务服务落地验证

优点:通用性强

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

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

相关文章

5个设计师常用素材库

推荐5个设计素材网站,免费下载! 1、菜鸟图库 菜鸟图库-免费设计素材下载 菜鸟图库是一个素材量非常丰富的网站,该网站聚合了平面、UI、淘宝电商、高清背景图、图片、插画等高质量素材。平面设计模板非常多,很多都能免费下载&…

springmvc实现controller接口

springmvc实现controller接口 前置配置 基础环境 springmvc 环境 jdk1.8 tomcat8.5 集成环境 ideasmart-tomcat (idea 中 tomcat插件) 实现controller接口 import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Control…

UNIAPP实战项目笔记59 NodeJS后端生成token 和 修复一些bug

UNIAPP实战项目笔记59 NodeJS后端生成token 和 修复一些bug 后端保持数据时往数据库写入token 修复一些前面遗留的问题bug 实际案例图片 后端接口文件 index.js var express require(express); var router express.Router(); var connection require(../db/sql.js); var us…

11、STM32通用定时器输出PWM

目录 1.通用定时器输出PWM 2.PWM的工作原理 3.PWM的内部运作机制 4.PWM的模式 41.边沿对齐模式 5.自动加载的预加载寄存器 6.定时器输出PWM结构体讲解 7.定时器输出PWM库函数讲解 8.定时器输出PWM----实战驱动SG90舵机 1.通用定时器输出PWM 以TIM3为例,STM…

makdown模版参考

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

一次性打包学透 Spring

不知从何时开始,Spring 这个词开始频繁地出现在 Java 服务端开发者的日常工作中,很多 Java 开发者从工作的第一天开始就在使用 Spring Framework,甚至有人调侃“不会 Spring 都不好意思自称是个 Java 开发者”。 之所以出现这种局面&#xf…

危害肠道健康的两大敌人:诺如病毒和轮状病毒

谷禾健康 // 近日,多地发生诺如病毒感染事件,诺如病毒引起的急性感染性腹泻进入发病高峰期。那么什么是诺如病毒?我们又该如何预防? 诺如病毒和轮状病毒都是传染性很强的肠道病毒,是导致急性胃肠炎的最重要原因之一。会…

如何自己搭建一个ai画图系统? 从0开始云服务器部署novelai

如何自己搭建一个ai画图系统? 从0开始云服务器部署novelai ​ 上面两张图都是通过ai生成的,是不是有以假乱真的感觉。 本教程提供的是自己搭建一个可以外网访问的ai系统的方法,需要采购gpu服务器(后续会出白嫖的方式)&…

Java俄罗斯方块游戏

技术:Java等摘要:俄罗斯方块是一款十分经典的游戏,它的主要运行规律为对系统随机产生的图形进行上下左右移动、旋转等操纵,使之排列成完整的一行或多行并且消除得分。它上手容易,难度循序渐进,老少皆宜&…

Android 架构 MVC MVP MVVM,这一波你应该了然于心

MVC,MVP和MVVM是软件比较常用的三种软件架构,这三种架构的目的都是分离,避免将过多的逻辑全部堆积在一个类中。在Android中,Activity中既有UI的相关处理逻辑,又有数据获取逻辑,从而导致Activity逻辑复杂不单…

Android入门第66天-使用AOP

开篇这篇恐怕又是一篇补足网上超9成关于这个领域实际都是错的、用不起来的一个知识点了。网上太多太多教程和案例用的是一个叫hujiang的AOP组件-com.hujiang.aspectjx:gradle-android-plugin-aspectjx。首先这些错的文章我不知道是怎么来的,其次那些案例真的运行成功…

数据库浅谈之 Bloom Filter

数据库浅谈之 Bloom Filter HELLO,各位博友好,我是阿呆 🙈🙈🙈 这里是数据库浅谈系列,收录在专栏 DATABASE 中 😜😜😜 本系列阿呆将记录一些数据库领域相关的知识 &am…

场景扩展,体验升级 | DBMotion新增无公网数据库迁移、支持监控报警等多项功能

丝滑的零停机数据库在线迁移工具——DBMotion,又双叒叕发新版:新增的网关、数据源功能,让你无公网IP的数据库也可以迁移;新增的监控功能,让你对迁移性能一目了然;新增的报警功能,让你及时获得同…

什么是SSL端口?HTTPS配置技术指南

安全套接字层(SSL)是负责互联网连接的数据身份验证和加密的技术。它加密在两个系统之间(通常在服务器和客户端之间)之间通过互联网发送的数据,使其保持私密。随着在线隐私的重要性日益增加,您应该熟悉SSL端…

【C语言】指针的定义和使用

指针一、什么是指针二、指针类型三、指针和数组的关系四、空指针五、野指针一、什么是指针 指针(Pointer)是编程语言中的一个对象,通过地址直接指向内存中该地址的值。由于通过地址能够找到所需的变量存储单元,可以说地址指向该变…

小样本学习

机器学习就是从数据中学习,从而使完成任务的表现越来越好。小样本学习是具有有限监督数据的机器学习。类似的,其他的机器学习定义也都是在机器学习定义的基础上加上不同的限制条件衍生出来。例如,弱监督学习是强调在不完整、不准确、有噪声、…

springboot+vue.js校园车辆用车预约管理系统

springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是目前最火热的java开发框架 前端技术:nodejsvueelementui本项目的应用场景描述如下&…

ARM+FPGA架构开发板PCIE2SCREEN示例分析与测试-米尔MYD-JX8MMA7

本篇测评由电子发烧友的优秀测评者“zealsoft”提供。 本次测试内容为米尔MYD-JX8MMA7开发板其ARM端的测试例程pcie2screen并介绍一下FPGA端程序的修改。 ​ 01. 测试例程pcie2screen 例程pcie2screen是配合MYD-JX8MMA7开发板所带的MYIR_PCIE_5T_CMOS 工程的测试例&#…

【JavaScript】基本语法大全

前言: 大家好,我是程序猿爱打拳。在学习C和Java这样的后端编程语言后,我们大概率会学习一些关于前端的语言如HTMLJavaScript。又因为前后端基本语法有些许不同,因此我整理出来。今天给大家讲解的是JS中的数据类型、运算符、选择结…

SAP ABAP 理解RAWSTRING(XSTRING) 类型

用F1查看的时候,这里是这样说的: The types RAWSTRING and STRING have a variable length. A maximum length for these types can be specified, but has no upper limit. The type SSTRING is available as of release 6.10 and it has a variable …