Golangci-Lint-Anwendung
Was ist Golangci-Lint?
linter
verwendet Tools, um einige Überprüfungen des Codes durchzuführen und so die Qualität des übermittelten Codes sicherzustellen. golangci-lint
是一个 Go linters 聚合器,而 linter
是使用工具来对代码提供一些检查,保证提交代码的质量。
为什么不直接使用 golangci-lint ?
需要手动执行,在之前使用的过程中,由于项目是多人活动,总是会忘记执行golangci-lint
进行代码检查,当前我自己也是。所以我们希望采用一种隐式的方式来自动执行。那么经过多番思考,采用 git 的 hooks 可以来自动执行一些脚本。
这期间还有一些其他的尝试,不过这个文章主要说 在git中的使用ci-lint,有兴趣的可以移步到为什么最终采用git 本地 hooks 的方式执行golangci-lint?
采用 git 的 hooks 来自动执行检查!
前提条件:
请设置 goland 的默认终端为 bash
,不然后面执行脚本的时候,可能会不支持。

由于现在采用 git 作为我们的版本管理系统(VCS),而git
bash
, andernfalls wird es möglicherweise nicht unterstützt, wenn das Skript später ausgeführt wird. 🎜.githooks
文件夹,然后增加 .golangci.yml
golangci-lint 使用的配置文件,
增加一个 手动执行goalngci-lint
的执行脚本golangci-lint.sh
,
最后就是项目应用 git hooks
的脚本init.sh
,用于初始化这个项目的脚本。
说了这么多,还不知道这个到底是干啥的,先来看一下效果图
在commit
的时候会帮助我们进行文件的 fmt
:

在push
goalngci-lint
s Ausführungsskriptgolangci-lint.sh
, 🎜🎜🎜🎜Das letzte ist die Projektanwendungfmt
:🎜
In 如果项目存在可能的问题,那么是不会让你 push 的。通过这种方式来保证服务器上的代码都是符合规则的。 首次通过执行 这会检查你的环境,如果一些工具不存在,它会自动下载。并会修改默认 好了,就这样,就是这么简单。 这都是小问题,复制内容过去吧。 但是在复制这些之前,你一定已经是在一个git 管理的根目录下。 那么下面就开始你的复制吧。 .githooks/pre-commit: .githooks/pre-push: golangci-lint.sh init.sh .golangci.yml 好了,现在你应该是这样的结构了吧 项目代码目录: 这个时候可以执行 Schließlich können Sie den Code im 使用方式:
1. 项目中已经存在这些内容
init.sh
脚本进行项目初始化设置。git
钩子指向当前项目的 .githooks
文件夹。2. 新建项目这个怎么搞
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".
# 获取所有变化的go文件
STAGED_GO_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep .go$)
if [ "$STAGED_GO_FILES" = "" ]; then
exit 0
fi
echo "check gofmt ..."
CHECK_FMT=$(gofmt -s -w -l $STAGED_GO_FILES)
if [ -n "${CHECK_FMT##* }" ]; then
echo
echo -e "these files will be\033[32m gofmt\033[0m formatted:"
for file in ${CHECK_FMT[*]}; do
echo -e "\033[36m\t$file\033[0m"
done
git add ${CHECK_FMT//\/n/ }
echo
fi
echo "check goimports ..."
CHECK_GOPLS=$(goimports -l -w $STAGED_GO_FILES)
if [ -n "${CHECK_GOPLS##* }" ]; then
echo
echo -e "these files will be\033[32m goimports\033[0m formatted:"
for file in ${CHECK_GOPLS[*]}; do
echo -e "\033[36m\t$file\033[0m"
done
git add ${CHECK_GOPLS//\/n/ }
echo
fi
printf "\033[32m COMMIT SUCCEEDED \033[0m\n"
echo
exit 0
#!/bin/sh
# An example hook script to verify what is about to be pushed. Called by "git
# push" after it has checked the remote status, but before anything has been
# pushed. If this script exits with a non-zero status nothing will be pushed.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If pushing without using a named remote those arguments will be equal.
#
# Information about the commits which are being pushed is supplied as lines to
# the standard input in the form:
#
# <local ref> <local oid> <remote ref> <remote oid>
#
# This sample shows how to prevent push of commits where the log message starts
# with "WIP" (work in progress).
#remote="$1"
#url="$2"
printf "\033[32m 推送前需要检查当前项目可以 go build 通过 \033[0m\n"
echo "run golangci-lint..."
echo
# 运行 golangci-lint 检查工具
golangci-lint run ./...
if [ $? -ne 0 ]; then
printf "\033[31m PUSH FAILED \033[0m\n"
exit 1
fi
printf "\033[32m PUSH SUCCEEDED \033[0m\n"
echo
exit 0
#!/bin/sh
if ! command -v golangci-lint &>/dev/null; then
echo "golangci-lint not installed or available in the PATH" >&2
echo "install golangci-lint ..." >&2
go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.50.1
fi
#goland 可直接定位文件
golangci-lint run ./... |sed 's/\\/\//g'
#!/bin/sh
# 检查 go 是否安装
checkGoEnv() {
# go是否安装
if ! command -v go &>/dev/null; then
echo "go not installed or available in the PATH" >&2
echo "please check https://golang.google.cn" >&2
exit 1
fi
# go proxy 是否设置
if [ -z $GOPROXY ]; then
echo "go proxy not set in the PATH" >&2
echo "please set GOPROXY, https://goproxy.cn,direct || https://goproxy.io,direct" >&2
exit 1
fi
echo "go env installed ..."
}
# 检查 go 相关工具包是否安装
checkGoLintEnv() {
if ! command -v goimports &>/dev/null; then
echo "goimports not installed or available in the PATH" >&2
echo "install goimports ..." >&2
go install golang.org/x/tools/cmd/goimports@latest
checkGoLintEnv
return
fi
echo "goimports installed ..."
}
# 检查 golangci-lint 是否安装
checkCiLintEnv() {
if ! command -v golangci-lint &>/dev/null; then
echo "golangci-lint not installed or available in the PATH" >&2
echo "install golangci-lint ..." >&2
go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.50.1
checkCiLintEnv
fi
echo "golangci-lint installed ..."
}
# 初始化钩子配置
initHooks() {
# 如果当前目录不存在 .githooks 目录,说明位置不对
if [ ! -d ".githooks" ]; then
echo "exec incorrect position"
exit 1
fi
# 检查是否已经设置了
exist=$(git config core.hooksPath)
if [ -z $exist ]; then
# 设置 hooks 默认位置
git config core.hooksPath .githooks
echo "init git hooks ..." >&2
fi
}
main() {
checkGoEnv
checkGoLintEnv
checkCiLintEnv
initHooks
}
main
run:
timeout: 2m
tests: false
linters:
disable-all: true
enable:
- typecheck
- staticcheck
- govet
- gocritic
linters-settings:
govet:
check-shadowing: true
disable-all: true
enable:
- asmdecl
- assign
- atomic
- atomicalign
- bools
- buildtag
- cgocall
- composites
- copylocks
- httpresponse
- loopclosure
- lostcancel
- nilfunc
- nilness
- printf
- shadow
- shift
- stdmethods
- structtag
- tests
- unmarshal
- unreachable
- unsafeptr
- unusedresult
staticcheck:
go: "1.17"
checks: [ "all", "-SA3*", "-SA6000", "-SA6001", "-SA6003", "-ST*", "ST1006", "ST1008", "ST1016", "-QF1" ]
gocritic:
enabled-tags:
- diagnostic
- experimental
- opinionated
- style
enabled-checks:
- sliceClear
disabled-tags:
- performance
disabled-checks:
- assignOp
- badLock
- badRegexp
- codegenComment
- commentFormatting
- commentedOutCode
- docStub
- dupArg
- dupBranchBody
- dupCase
- dupImport
- exitAfterDefer
- externalErrorReassign
- flagDeref
- hexLiteral
- ifElseChain
- importShadow
- initClause
- mapKey
- nestingReduce
- newDeref
- redundantSprint
- regexpMust
- regexpPattern
- regexpSimplify
- ruleguard
- sloppyLen
- sloppyTypeAssert
- sortSlice
- sprintfQuotedString
- sqlQuery
- stringConcatSimplify
- syncMapLoadAndDelete
- tooManyResultsChecker
- typeDefFirst
- typeUnparen
- underef
- unlabelStmt
- unlambda
- unnecessaryBlock
- unnecessaryDefer
- yodaStyleExpr
- whyNoLint
- paramTypeCombine
- emptyStringTest
├── .githooks
│ ├── pre-commit
│ └── pre-push
├── .golangci.yml
├── golangci-lint.sh
└── init.sh
init.sh
脚本来初始化了。https://github.com/ywanbing/golangci
Lager erhalten.
Das obige ist der detaillierte Inhalt vonGolangci-Lint-Anwendung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

In Go können WebSocket-Nachrichten mit dem Paket gorilla/websocket gesendet werden. Konkrete Schritte: Stellen Sie eine WebSocket-Verbindung her. Senden Sie eine Textnachricht: Rufen Sie WriteMessage(websocket.TextMessage,[]byte("message")) auf. Senden Sie eine binäre Nachricht: Rufen Sie WriteMessage(websocket.BinaryMessage,[]byte{1,2,3}) auf.

Speicherlecks können dazu führen, dass der Speicher des Go-Programms kontinuierlich zunimmt, indem: Ressourcen geschlossen werden, die nicht mehr verwendet werden, wie z. B. Dateien, Netzwerkverbindungen und Datenbankverbindungen. Verwenden Sie schwache Referenzen, um Speicherlecks zu verhindern, und zielen Sie auf Objekte für die Garbage Collection ab, wenn sie nicht mehr stark referenziert sind. Bei Verwendung von Go-Coroutine wird der Speicher des Coroutine-Stapels beim Beenden automatisch freigegeben, um Speicherverluste zu vermeiden.

In Go umfasst der Funktionslebenszyklus Definition, Laden, Verknüpfen, Initialisieren, Aufrufen und Zurückgeben; der Variablenbereich ist in Funktionsebene und Blockebene unterteilt. Variablen innerhalb einer Funktion sind intern sichtbar, während Variablen innerhalb eines Blocks nur innerhalb des Blocks sichtbar sind .

In Go können Sie reguläre Ausdrücke verwenden, um Zeitstempel abzugleichen: Kompilieren Sie eine Zeichenfolge mit regulären Ausdrücken, z. B. die, die zum Abgleich von ISO8601-Zeitstempeln verwendet wird: ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ . Verwenden Sie die Funktion regexp.MatchString, um zu überprüfen, ob eine Zeichenfolge mit einem regulären Ausdruck übereinstimmt.

Go und die Go-Sprache sind unterschiedliche Einheiten mit unterschiedlichen Eigenschaften. Go (auch bekannt als Golang) ist bekannt für seine Parallelität, schnelle Kompilierungsgeschwindigkeit, Speicherverwaltung und plattformübergreifende Vorteile. Zu den Nachteilen der Go-Sprache gehören ein weniger umfangreiches Ökosystem als andere Sprachen, eine strengere Syntax und das Fehlen dynamischer Typisierung.

Go-Funktionsdokumentation mit der IDE anzeigen: Bewegen Sie den Cursor über den Funktionsnamen. Drücken Sie den Hotkey (GoLand: Strg+Q; VSCode: Nach der Installation von GoExtensionPack F1 und wählen Sie „Go:ShowDocumentation“).

Das Testen gleichzeitiger Funktionen in Einheiten ist von entscheidender Bedeutung, da dies dazu beiträgt, ihr korrektes Verhalten in einer gleichzeitigen Umgebung sicherzustellen. Beim Testen gleichzeitiger Funktionen müssen grundlegende Prinzipien wie gegenseitiger Ausschluss, Synchronisation und Isolation berücksichtigt werden. Gleichzeitige Funktionen können Unit-Tests unterzogen werden, indem Rennbedingungen simuliert, getestet und Ergebnisse überprüft werden.

Das Verfassen einer klaren und umfassenden Dokumentation ist für das Golang-Framework von entscheidender Bedeutung. Zu den Best Practices gehört die Befolgung eines etablierten Dokumentationsstils, beispielsweise des Go Coding Style Guide von Google. Verwenden Sie eine klare Organisationsstruktur, einschließlich Überschriften, Unterüberschriften und Listen, und sorgen Sie für eine Navigation. Bietet umfassende und genaue Informationen, einschließlich Leitfäden für den Einstieg, API-Referenzen und Konzepte. Verwenden Sie Codebeispiele, um Konzepte und Verwendung zu veranschaulichen. Halten Sie die Dokumentation auf dem neuesten Stand, verfolgen Sie Änderungen und dokumentieren Sie neue Funktionen. Stellen Sie Support und Community-Ressourcen wie GitHub-Probleme und Foren bereit. Erstellen Sie praktische Beispiele, beispielsweise eine API-Dokumentation.
