islishude / blog

my web notes
https://islishude.github.io/blog/
101 stars 15 forks source link

vscode-go 设置 lint 不强制检查对包公开属性注释 #193

Closed islishude closed 5 years ago

islishude commented 5 years ago

vscode-go 插件使用 golint 作为默认代码风格检查工具,而 golint 需要对包公开类型等需要注释说明用途,而且必须以类型名称开头。

所以经常会遇到风格检查下面的错误:

exported function ... should have comment or be unexported

但是对于国内的公司而言,不能只用英语注释吧,或者中英文混杂的注释,如下所示:

// Door is a door
type Door struct {}

// Dog is 狗的定义
type Dog struct {}

代码要定义一个们,所以我需要注释说明这是个门,想想都很滑稽。不过要具体说明用途的话,GoDoc 生成的文档对阅读代码的人而言还是很有帮助的,代码写完就是文档,以下图片是 context 包的文档,是不是特别清晰?

image

不过要关闭这个还是可以的,vscode-go 插件提供了很多个可选的 lint,只要改成 golangci-lint 就可以关闭强制lint。

image

golangci-lint 还支持注释指令,比如说 golangci-lint 有个强制规则就是需要检查函数 error 返回值,但是有些函数只是为了实现某些接口,一直返回一个 nil error,这个时候再次检查就有些累赘了。

比如说 Hash.Write 函数为了实现 io.Writer 返回 (int, error),但是 error 永远为 nil 的。

以 sha256 为例,可以看到 error 就是默认的 nil。

func (d *digest) Write(p []byte) (nn int, err error) {
    nn = len(p)
    d.len += uint64(nn)
    if d.nx > 0 {
        n := copy(d.x[d.nx:], p)
        d.nx += n
        if d.nx == chunk {
            block(d, d.x[:])
            d.nx = 0
        }
        p = p[n:]
    }
    if len(p) >= chunk {
        n := len(p) &^ (chunk - 1)
        block(d, p[:n])
        p = p[n:]
    }
    if len(p) > 0 {
        d.nx = copy(d.x[:], p)
    }
    return
}

这个时候就可以加上注释指令,忽略这个错误检查。

package main

import (
    "crypto/sha256"
    "fmt"
)

func main() {
    h := sha256.New()
    h.Write([]byte("hello world\n")) //nolint: errcheck
    fmt.Printf("%x", h.Sum(nil))
}
islishude commented 5 years ago

move to https://islishude.github.io/blog/2019/03/15/tool/vscode-go-%E8%AE%BE%E7%BD%AE-lint-%E4%B8%8D%E5%BC%BA%E5%88%B6%E6%A3%80%E6%9F%A5%E5%AF%B9%E5%8C%85%E5%85%AC%E5%BC%80%E7%B1%BB%E5%9E%8B%E6%98%AF%E5%90%A6%E6%B3%A8%E9%87%8A/