17

例如-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 中知道它。不是因为拖钓什么的。

4

6 回答 6

29

您可以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:将结果写入(源)文件而不是标准输出
于 2013-05-31T18:02:55.097 回答
3

检查语法有什么意义吗?Go 编译器非常快,你也可以编译所有内容。

从这个意义上说,底层的心智模型与 Ruby 的心智模型完全不同。

只需使用go buildor go installhttp://golang.org/cmd/go/

于 2013-06-02T07:57:14.993 回答
2

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

另一方面,Go 是一种编译语言,因此如果出现语法错误,它根本无法运行。因此,了解是否存在错误的最简单方法是使用go build.

于 2013-05-31T18:06:24.960 回答
1

与@Rick-777 一致,我强烈建议使用go build. 它执行不执行的附加检查go fmt(例如:丢失或不必要的导入)。

如果您担心在源目录中创建二进制文件,您可以随时go build -o /dev/null丢弃输出,这实际上简化go build为代码将构建的测试。这可以让您进行语法检查等。

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

于 2016-03-10T14:44:22.280 回答
0

对于那些不想满足于仅检查的人的更新答案gofmt

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

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

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

于 2016-08-06T01:37:37.410 回答
0

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
于 2017-03-14T17:03:14.787 回答