Есть ли инструмент командной строки в Голанге только для проверки синтаксиса моего исходного кода?

Например, в 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