重要
环境说明
问题
1. Implicit memory aliasing in for loop
报错意思是:在循环中重复使用变量的地址 参考链接
因为for语句中变量是被重用的,即变量内存地址不变,但值发生变化。当取消引用指针时,值可能发生改变,所以静态检查报错
1.1 错误写法
1
2
3
4
| for i, v := range versions {
res := createWorkerFor(&v)
...
}
|
1.2 正确写法
- for循环中使用元素的实际地址i,而非迭代变量取值(推荐)
1
2
3
| for i := range versions {
res := createWorkerFor(&versions[i])
}
|
1
2
3
4
| for _, v := range versions {
v := v
res := createWorkerFor(&v) // this is now the address of the inner v
}
|
1
2
3
4
5
| for _, v := range versions {
go func(arg ObjectDescription) {
x := &arg // safe
}(v)
}
|
2. commentFormatting: put a space between //
and comment text
注释后面需要加空格
2.1 错误写法
1
| //UpdatePatch update patch - edit qlet`s information, and generate a new version patch
|
2.2 正确写法
1
| // UpdatePatch update patch - edit qlet`s information, and generate a new version patch
|
2.3 IDE配置
goland中,可以点击File
- Settings
- Editor
- Code Style
- Go
-Other
下,勾选Add a leading space to comments
。可以实现注释代码时自动在//
后加空格。
3. Consider preallocating (prealloc) lint
考虑 预先分配问题 参考链接
使用make预先分配合理的内存空间,能减少复制和扩展。
3.1 错误写法
1
2
3
4
| var to []string
for i := range s.To {
to = append(to, s.To[i].String())
}
|
3.2 正确写法
1
2
3
4
| to := make([]string, 0, len(s.To))
for i := range s.To {
to = append(to, s.To[i].String())
}
|
或者干脆使用append,直接对切片对象赋值
1
2
3
4
| to := make([]string, len(s.To))
for i, t := range s.To {
to[i] = t.String()
}
|
4. should replace errors.New(fmt.Sprintf(…)) with fmt.Errorf(…)
go 1.13之后,推荐使用fmt.Errof("%w",err)来生成error
4.1 错误写法
1
| errors.New(fmt.Sprintf("error is %s", err.Error()))
|
4.2 正确写法
1
| fmt.Errorf("error is %w", err)
|
5. error strings should not be capitalized or end with punctuation or a newline
error 信息不应该: 以大写字母开头 或 以标点符号\换行结尾。
6. don’t use MixedCaps in package name
包的名称不能大小写混写,应全小写
6.1 错误写法
6.2 正确写法
暴露出去的结构体或方法,应该加注释或不对外暴露。
暴露出去的类型U
的注释,应该为这种格式// U xxx
。即以变量名开头
9. 使用errors.Is方法替代
使用errors.Is方法替换错误信息校验
### 9.1 错误写法
1
2
3
4
5
6
7
8
9
| if fieldErr, ok := err.(validator.ValidationErrors); ok {
var tagErrorMsg []string
for key, value := range fieldErr.Translate(validate.Trans) {
tagErrorMsg = append(tagErrorMsg, fmt.Sprintf("%s: %s", key, value))
}
respErr := errors.New(strings.Join(tagErrorMsg, ","))
return respErr
}
|
9.2 正确写法
1
2
3
4
5
6
7
8
9
10
| var fieldErr validator.ValidationErrors
if errors.Is(err, fieldErr) {
var tagErrorMsg []string
for key, value := range fieldErr.Translate(validate.Trans) {
tagErrorMsg = append(tagErrorMsg, fmt.Sprintf("%s: %s", key, value))
}
respErr := errors.New(strings.Join(tagErrorMsg, ","))
return respErr
}
|
Reference