Golang中是否有一个命令行工具只检查我的源代码的语法?

时间:2013-05-31 17:46:58

标签: go

例如,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中是否有类似的功能?

P.S。来自Ruby的一个例子只是因为我在Ruby中知道它。不是因为拖钓或其他什么。

6 个答案:

答案 0 :(得分:23)

您可以使用gofmt检查语法错误,而无需实际构建项目。

gofmt -e my_file.go

-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

答案 1 :(得分:3)

Ruby是一种解释型语言,因此检查语法的命令可能有意义(因为我假设即使在某些时候存在语法错误,您也可能运行该程序。)

另一方面,Go是一种编译语言,因此如果存在语法错误,则根本无法运行。因此,了解错误的最简单方法是使用go build构建程序。

答案 2 :(得分:2)

检查语法有多少意义? Go编译器速度非常快,您也可以编译所有内容。

从这个意义上讲,潜在的心理模型与Ruby的模式完全不同。

只需使用go buildgo install即可。 http://golang.org/cmd/go/

答案 3 :(得分:0)

与@ Rick-777达成协议,我强烈建议您使用go build。它执行go fmt没有的额外检查(例如:丢失或不必要的导入)。

如果您担心在源目录中创建二进制文件,可以始终go build -o /dev/null放弃输出,这实际上会将go build减少为代码将构建的测试。除此之外,还可以进行语法检查。

编辑:请注意go build在构建非主包时不生成二进制文件,因此您不需要-o选项。

答案 4 :(得分:0)

为那些不想仅仅使用gofmt进行核实的人解决了更新的答案:

您可以将gotype替换为go build,以获得验证语法和结构的go编译器的前端: https://godoc.org/golang.org/x/tools/cmd/gotype

速度与gofmt的比较,但会返回您从go build获得的所有错误。

唯一需要注意的是,它似乎需要其他包go install,否则它们找不到它们。不知道为什么会这样。

答案 5 :(得分:0)

golang语法检查程序

将以下代码放在bin目录和chmod 0755中名为 gochk 的文件中。

然后运行gochk -- help

#!/bin/bash
#
# gochk v1.0 2017-03-15 - golang syntax checker - ekerner@ekerner.com
# 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 - ekerner@ekerner.com"; 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
gos=$@
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/questions/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