代码规范
方便团队内部统一风格,提高代码可读性,统一性
命名规范
包名
- 尽量和目录名一致2. 采用有意义,简短3. 不要和标准库冲突4. 包名应该尽量全部小写
文件名
- 如果多个单词可以采用蛇形命名法
变量名
- 蛇形 不使用2. 驼峰 go un userName3. 专有名词全大写或者全小写
结构名
- 驼峰 首字母大写
接口命名
- 和结构体差不多2. 接口已er结尾3. IR
常量命名
- 全部大写,多个单词采用蛇形APP_VERSION
注释规范:
go提供两种注释:
- //适合单行注释
- 大段注释
- 变量后面加注释
- 包注释
- 接口注释
- 函数注释
- 代码逻辑注释
import注释
- go自带的包
- 第三方的包
- 自己内部的包
单元测试
单元测试命令:go test
go test命令是一个按照一定约定和组织的测试代码驱动程序。在包目录中,所有以_test.go为后缀的源码文件都会被go test运行
我们写的__test.go源码文件不用担心内容过多,因为go build命令不会将这些测试文件打包到最后的可执行文件
test文件有4类,Test开头的 功能测试
Benchmark开头的 性能测试
example 模糊测试
func TestAdd(t *testing.T) {
}
跳过耗时单元测试
func TestAdd2 (t *testing.T) {
if testing.Short() {
t.Skip("short 模式下跳过")
}
re := add(a:1,b:2)
if re != 3 {
t.Errorf("expect %d,actual %d")
}
}
go test -short
运行一个短的
基于表格的测试用例
func TestAdd(t *Testing.T) {
var dataset = []struct{
a int
b int
out int
}{
{a:1,b:2,out:3}
{a:1,b:2,out:3}
{a:1,b:2,out:3}
{a:1,b:2,out:3}
{a:1,b:2,out:3}
}
for _,value := range dataset {
re := add(value.a,value.b)
if re != value.out {
t.Errorf("expect:%d,actual:%d",value.out,re)
}
}
}
性能测试
核心函数
func BenchmarAdd(bb *testing.B) {
var a,b,c int
a = 123
b = 456
c = 789
for i:= 0;i< bb.N;i++ {
if actual := add(a,b);actual != c{
fmt.Printf("%d+%d,except:%d,actual:%d",a,b,c,actual)
}
}
}
实例
对三种字符串的拼接方式进行性能测试
package light_edit
import (
"fmt"
"strconv"
"strings"
"testing"
)
const numbers = 10000
func BenchmarkStringBuilder(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
var builder strings.Builder
for j := 0; j < numbers; j++ {
builder.WriteString(strconv.Itoa(j))
}
_ = builder.String()
}
b.StopTimer()
}
func BenchmarkStringAdd(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
var str string
for j := 0; j < numbers; j++ {
str = str + strconv.Itoa(j)
}
}
b.StopTimer()
}
func BenchmarkStringSprintf(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ {
var str string
for j := 0; j < numbers; j++ {
str = fmt.Sprintf("%s%d", str, j)
}
}
b.StopTimer()
}
版权归原作者 入 梦皆星河 所有, 如有侵权,请联系我们删除。