例如,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中知道它。不是因为拖钓或其他什么。
答案 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 build
或go 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