例如-c
,Ruby 中有一个选项可以在运行代码之前检查语法:
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 中知道它。不是因为拖钓什么的。
例如-c
,Ruby 中有一个选项可以在运行代码之前检查语法:
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 中知道它。不是因为拖钓什么的。
您可以gofmt
在不实际构建项目的情况下检查语法错误。
gofmt -e my_file.go > /dev/null
以后可以使用 $? bash 变量,返回码 0 表示成功,2 表示语法检查。/dev/null 会吃掉代码,但错误会转到 stderr
该-e
选项定义为:
报告所有错误(不仅仅是不同行的前 10 个错误)
gofmt --帮助 用法:gofmt [标志] [路径 ...] -comments=true:打印评论 -cpuprofile="": 将 cpu 配置文件写入此文件 -d=false:显示差异而不是重写文件 -e=false:报告所有错误(不只是不同行的前 10 个) -l=false:列出格式与 gofmt 不同的文件 -r="":重写规则(例如,'a[b:len(a)] -> a[b:]') -s=false:简化代码 -tabs=true:使用制表符缩进 -tabwidth=8:标签宽度 -w=false:将结果写入(源)文件而不是标准输出
只检查语法有什么意义吗?Go 编译器非常快,你也可以编译所有内容。
从这个意义上说,底层的心智模型与 Ruby 的心智模型完全不同。
只需使用go build
or go install
。http://golang.org/cmd/go/
Ruby 是一种解释型语言,因此检查语法的命令可能有意义(因为我假设即使在某些时候存在语法错误,您也可能会运行该程序)。
另一方面,Go 是一种编译语言,因此如果出现语法错误,它根本无法运行。因此,了解是否存在错误的最简单方法是使用go build
.
与@Rick-777 一致,我强烈建议使用go build
. 它执行不执行的附加检查go fmt
(例如:丢失或不必要的导入)。
如果您担心在源目录中创建二进制文件,您可以随时go build -o /dev/null
丢弃输出,这实际上简化go build
为代码将构建的测试。这可以让您进行语法检查等。
编辑:请注意,go build
在构建非主包时不会生成二进制文件,因此您不需要 -o 选项。
对于那些不想满足于仅检查的人的更新答案gofmt
:
您可以替代gotype
获取go build
验证语法和结构的 go 编译器的前端:
https ://godoc.org/golang.org/x/tools/cmd/gotype
它的速度与 比较gofmt
,但会返回您从中获得的所有错误go build
。
需要注意的是,它似乎需要go install
编辑其他包,否则找不到它们。不知道为什么会这样。
golang 语法检查器
将以下代码放在bin 目录中名为gochkchmod 0755
的文件中,然后将.
然后运行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