Есть ли инструмент командной строки в Голанге только для проверки синтаксиса моего исходного кода?
Например, в Ruby есть опция -c
которая проверяет синтаксис перед запуском кода:
C:\>ruby --help
Usage: ruby [switches] [--] [programfile] [arguments]
-c check syntax only
C:\>ruby -c C:\foo\ruby\my_source_code.rb
Syntax OK
Есть ли аналогичная функциональность в Go?
PS Пример из Ruby - это только потому, что я знаю это в Ruby. Не из-за троллинга или чего-то еще.
Ответы
Ответ 1
Вы можете использовать gofmt
для проверки синтаксических ошибок без фактической сборки проекта.
gofmt -e my_file.go > /dev/null
Вы можете позже использовать $? переменная bash, код возврата 0 означает успех, 2 означает проверку синтаксиса. /dev/null будет есть код, но ошибки идут в stderr
Опция -e
определяется как:
сообщать обо всех ошибках (не только первые 10 в разных строках)
gofmt --help
usage: gofmt [flags] [path ...]
-comments=true: print comments
-cpuprofile="": write cpu profile to this file
-d=false: display diffs instead of rewriting files
-e=false: report all errors (not just the first 10 on different lines)
-l=false: list files whose formatting differs from gofmt's
-r="": rewrite rule (e.g., 'a[b:len(a)] -> a[b:]')
-s=false: simplify code
-tabs=true: indent with tabs
-tabwidth=8: tab width
-w=false: write result to (source) file instead of stdout
Ответ 2
Ruby - интерпретируемый язык, поэтому команда, которая проверяет синтаксис, может иметь смысл (поскольку я предполагаю, что вы могли бы запустить программу, даже если в какой-то момент есть синтаксические ошибки).
С другой стороны, это скомпилированный язык, поэтому его нельзя запускать вообще, если есть синтаксические ошибки. Таким образом, самый простой способ узнать, есть ли ошибки, - это построить программу с помощью go build
.
Ответ 3
Много ли стоит проверять синтаксис? Компилятор Go настолько быстр, что вы тоже можете скомпилировать все.
В этом смысле лежащая в основе ментальная модель совсем не похожа на модель Ruby.
Просто используйте go build
или go install
. http://golang.org/cmd/go/
Ответ 4
По соглашению с @Rick-777, я настоятельно рекомендую использовать go build
. Он выполняет дополнительные проверки, которые не выполняются go fmt
(например: отсутствие или ненужный импорт).
Если вы беспокоитесь о создании двоичного go build -o/dev/null
в исходном каталоге, вы всегда можете go build -o/dev/null
чтобы отбросить вывод, что существенно сократит go build
до теста, который будет строить код. Это дает вам синтаксическую проверку, среди прочего.
EDIT: обратите внимание, что go build
не генерирует двоичный файл при создании неосновных пакетов, поэтому вам не нужна опция -o.
Ответ 5
Обновленный ответ для тех, кто не хочет соглашаться только на проверку с помощью gofmt
:
Вы можете заменить gotype
для go build
чтобы получить только интерфейс компилятора go, который проверяет как синтаксис, так и структуру: https://godoc.org/golang.org/x/tools/cmd/gotype
Он сравнивает скорость с gofmt
, но возвращает все ошибки, которые вы получили от go build
.
Одно из предостережений заключается в том, что, по-видимому, требуется, чтобы другие пакеты были go install
, иначе они их не найдут. Не знаю, почему это так.
Ответ 6
проверка синтаксиса golang
Поместите нижеприведенный код в файл gochk в каталог bin и chmod 0755
.
Затем запустите gochk -- help
#!/bin/bash
#
# gochk v1.0 2017-03-15 - golang syntax checker - [email protected]
# see --help
# usage and version
if \
test "$1" = "-?" || \
test "$1" = "-h" || \
test "$1" = "--help" || \
test "$1" = "-v" || \
test "$1" = "--version"
then
echo "gochk v1.0 2017-03-15 - golang syntax checker - [email protected]"; echo
echo "Usage:"
echo " $0 -?|-h|--help|-v|--version # show this"
echo " $0 [ file1.go [ file2.go . . . ] ] # syntax check"
echo "If no args passed then *.go will be checked"; echo
echo "Examples:"
echo " $0 --help # show this"
echo " $0 # syntax check *.go"
echo " $0 cmd/my-app/main.go handlers/*.go # syntax check list"; echo
echo "Authors:"
echo " http://stackoverflow.com/users/233060/ekerner"
echo " http://stackoverflow.com/users/2437417/crazy-train"
exit
fi
# default to .go files in cwd
[email protected]
if test $# -eq 0; then
gos=$(ls -1 *.go 2>/dev/null)
if test ${#gos[@]} -eq 0; then
exit
fi
fi
# test each one using gofmt
# credit to Crazy Train at
# http://stackoverflow.com/info/16863014/is-there-a-command-line-tool-in-golang-to-only-check-syntax-of-my-source-code
#
for go in $gos; do
gofmt -e "$go" >/dev/null
done