Skip to main content

编码指南

基础指南

GO 作为一种语言为代码提供了内置的格式化程序:gofmt。 该项目使用在 gofmt 中实现的预定义格式。 这意味着例如:tabs而不是空格等。 阅读 Effective GO 页面了解更多详情。 在创建拉取请求之前,请确保至少使用 gofmt 格式化代码。

除了 Effective GO 指南之外,请遵循 CodeReviewComments wiki 页面中的建议。 wiki 提供了一个很好的代码审查注释库。 大多数注释将在下面描述的自动检查中进行检查。

使用 IDE(如 GoLand 或 Visual Studio Code)时,请使用内置的选项。 大多数 IDE 将提供大量检查或格式化选项列表,以帮助格式化和指出代码的问题。 有关 GoLand IDE 的基本设置,请参阅 IDE 设置

自动检查

并非所有代码都会使用 IDE 进行编写。 即使在贡献者之间,所有安装的设置也可能不同。 为了帮助保持代码格式一致,lint 工具是代码批准的一部分。

Go 有大量可用的 lint 工具。 大多数 lint 工具只检查一件特定的事情。 一些工具将聚合一些 linter,并提供所有发现的问题的概述。 对于该项目,我们选择了 golangci-lint 工具。 该工具可以在本地运行,并将集成到 GitHub PR 流程中。

本地安装和运行

我们可以按照项目提供的 安装说明 进行运行。 不过根据您的开发系统,说明可能会略有不同。

安装工具后,您可以使用标准命令行运行它:

golangci-lint run

这些项目仍然会产生许多警告。 高影响警告已通过评论修复或忽略,请参阅 误报

如果您一直在研究新功能或修复错误,您只想检查已更改的文件。 您可以使用选项 --new--new-from-rev 选项运行该工具。 --new 选项只会检查未提交的文件。 --new-from-rev 选项将根据特定提交的修订检查更改。

# 对于未提交的更改
golangci-lint run --new
# 针对修订提交的更改
golangci-lint run --new-from-rev=origin/master

make命令追加 lint:

make lint

make 使用 linter 集成检查可执行文件的两个位置:

  • $(go env GOPATH)/bin/
  • ./bin/

对于开发人员和 CI 安装,标准的安装位置略有不同。 通过检查这两个位置,我们可以在本地和自动构建期间运行。

make 集成使用 --new-from-rev 命令行选项。 要检查的修改被确定为运行的一部分,以允许它在我们的 CI 构建期间在不同的分支和拉取请求上运行。 lint 检查是项目的标准 CI 构建运行的一部分。

有关如何运行该工具的更多选项和信息,请参阅 golangci-lint 产品文档。

配置

为使用它们的两个项目提供了预定义的配置:

Web 界面是一个 javascript 项目,调度接口只生成了 Go 代码,因此不使用它。

拉取请求中的集成

计划是将 golangci-lint 检查集成到 GitHub PR 流程中。

误报

工具从来都不是 100% 正确的,这个也不是。 某些问题因太难纠正或不够重要而无法修复。

该工具允许向代码添加注释以忽略该问题。 这些注释应该谨慎使用,因为它们可能会隐藏问题。 如果使用它们,则应附有注明以解释使用它们的原因。

    var s1 = "ignored by all linters" //nolint
var s2 = "ignored by the linter unused" //nolint:unused

我们不鼓励使用没有特定 linter 的 nolint 注释。

GoLand IDE 设置

GoLand 默认开启了许多检查。 这些默认值已经提供了很好的覆盖率,并将 linter 发现的许多问题标记为问题。 要进一步扩大覆盖范围并帮助标记问题,请主动检查以下设置并将其更改为根据屏幕截图的设置。

preferences 偏好

打开 preferences 窗格并转到:Editor -> Code Style -> Go 需要配置三个选项卡,前两个对于遵守 gofmtgoimports 的基本规则至关重要:

Tabstabs
Importsimports
Otherother

上面配置的导入在使用时应该在一个文件中创建 3 组导入:

  1. 标准库导入
  2. 第三方导入
  3. YuniKorn 内部导入

在文件中,它将为您提供如下所示的导入:

import (
// 标准库导入

// 第三方

// YuniKorn 项目导入
)

检查

除开有助于突出显示阴影变量的检查,我们才可以使用默认检查。 阴影变量可能导致难以跟踪和掩盖代码中的错误,应尽可能防止。

检查