高质量编程与性能调优实战 | 青训营

62 阅读5分钟
  1. 高质量编程 分为高质量编程的定义,编码规范,性能优化建议;

高质量意思是编写的代码能够达到正确可靠、简介清晰的目标就可以称为高质量;

包括各种边界条件是否考虑完备,异常情况处理,稳定性保证,易读易维护;

编程原则:简单性,可读性,生产力; 编码规范-注释:公共符号始终要注释,包中声明的每个公共的符号: 变量、常量、函数以及结构都需要添加注释;任何既不显示也不简短的公共功能必须予以注释;无论长度或复杂程度如何,对库中的任何函数都必须进行注释;

在go语言中可以使用gofmt 自动格式化代码。

gofmt

gofmt是Go语言官方提供的一个命令行工具,用于格式化Go代码。它会自动调整代码的缩进、空格、括号位置等,以确保代码的一致性和可读性。

在命令行中,可以使用以下命令来运行gofmt工具:

gofmt -w <文件或目录>

其中,-w选项表示将格式化后的代码直接写回源文件,如果不使用-w选项,则gofmt会将格式化后的代码输出到标准输出。

例如,要格式化名为main.go的文件,可以运行以下命令:

gofmt -w main.go

如果要格式化整个项目目录下的所有Go文件,可以运行以下命令:

gofmt -w .

需要注意的是,gofmt工具会直接修改源文件,因此在运行之前,建议先备份代码,以防止意外修改。

此外,还可以使用一些编辑器或IDE中的插件,如GoLand、Visual Studio Code的Go插件等,来自动触发gofmt工具的格式化操作。这样可以在保存文件时自动进行代码格式化,进一步提高开发效率。

goimports

goimports也是一个Go语言官方提供的工具,它是在 gofmt的基础上增加了自动导入功能。除了格式化代码外,goimports还会自动检测并添加缺失的导入语句,删除未使用的导入语句,并按照一定的规则对导入语句进行排序并分类。 2. 注释

在Go语言中,注释是用来对代码进行说明和解释的文本。Go语言支持两种类型的注释:单行注释和多行注释。

单行注释:以//开头,用于注释单行代码或单行说明。

// 这是一个单行注释
fmt.Println("Hello, World!") // 打印Hello, World!

多行注释:以/*开头,以*/结尾,用于注释多行代码或多行说明。

/*
这是一个多行注释,
可以跨越多行。
*/
fmt.Println("Hello, World!")

除了用来对代码进行说明,注释还可以用来生成文档。在Go语言中,可以使用特殊格式的注释来生成文档,这种注释被称为文档注释或文档注解。

文档注释以/开头,以/结尾,并且在每行注释前添加一个*。文档注释可以包含一些特殊的标记,如@param、@return等,用于描述函数的参数和返回值。

/*
calculateSum函数用于计算两个整数的和。
@param a 第一个整数
@param b 第二个整数
@return 两个整数的和
*/
func calculateSum(a, b int) int {
    return a + b
}

可以使用go doc命令来查看代码中的文档注释。

go doc <包名>.<函数名>

例如,要查看calculateSum函数的文档注释,可以运行以下命令:

go doc <包名>.calculateSum

注释是编写清晰、易读的代码的重要组成部分。良好的注释可以帮助其他开发人员理解代码的意图和功能,并且可以用来生成文档以供参考。因此,在编写代码时,建议使用注释来解释和说明代码的逻辑和功能。

-l 显示那些需要格式化的文件

-w把改写后的内容直接写入到文件中,而不是作为结果打印到标准输出。

-r添加形如“a[b:len(a)]->a[b:]”的重写规则,方便我们做批量替换

-s简化文件中的代码

-d显示格式化前后的diff而不是写入文件,默认是false

-e打印所有的语法错误到标准输出。如果不使用此标记,则只会打印不同行的前10个错误。

-cpuprofile支持调试模式,写入相应的cpufile到指定的文件

gofmt 插件

gofmt 插件有 gofmt, goimports, go metalinter

gofmt 保存的时候自动格式化go代码 goimports 保存的时候自动导入处理包 gometalinter 保存的时候自动检查go语法

编码规范-注释

注释应该做的: 注释应该解释代码的作用;解释代码如何做的;实现的原因;什么情况会出错;

注释应该解释代码实现的原因,包括适合解释代码的外部因素,提供额外上下文等。

命名规范 function

函数名不懈怠包名的上下问信息,因为包名核函数名总是成对出现的; 函数名尽量简短;

  1. 性能分析工具 pprof- 排查实战 搭建pprof 实践项目

3434.png

0303.png

package main

import ( "log" "net/http" _ "net/http/pprof" "os" "runtime" "time"

"github.com/wolfogre/go-pprof-practice/animal"

)

func main() { log.SetFlags(log.Lshortfile | log.LstdFlags) log.SetOutput(os.Stdout)

runtime.GOMAXPROCS(1)
runtime.SetMutexProfileFraction(1)
runtime.SetBlockProfileRate(1)

go func() {
	if err := http.ListenAndServe(":6060", nil); err != nil {
		log.Fatal(err)
	}
	os.Exit(0)
}()

for {
	for _, v := range animal.AllAnimals {
		v.Live()
	}
	time.Sleep(time.Second)
}

}

性能分析命令 CPU

topN 查看占用资源最多的函数

参数意义: flat 当前函数本身的执行耗时 flat% flat占CPU 总实践的比例 sum% 上面每一行的 flat%总和 cum 指当前函数本身加上其调用函数的总耗时 cum% 表示 cum 占CPU 总时间的比例;