`cmd/gofmt: 不一致的运算符周围的空格格式化`

jhkqcmku  于 4个月前  发布在  Go
关注(0)|答案(6)|浏览(51)

你正在使用的Go版本是什么( go version )?

$ go version
go version go1.12.9 linux/amd64

这个问题在最新版本中是否会重现?

是的,在 https://play.golang.org/p/Ei6Hu4QqAHa 上的 format 按钮测试过。

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/{username}/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/{username}/go"
GOPROXY=""
GORACE=""
GOROOT="/snap/go/4301"
GOTMPDIR=""
GOTOOLDIR="/snap/go/4301/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build430600410=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

函数调用内的运算符格式不一致,取决于它们是否在 append 内。

你期望看到什么?

bar := []int{
    baz(1 * 2),
  }
  bar = append(bar,
    baz(1 * 2),
  )

你实际看到了什么?

bar := []int{
    baz(1 * 2),
  }
  bar = append(bar,
    baz(1*2),
  )
ipakzgxi

ipakzgxi1#

我相信这是有意为之,但与 append 函数本身无关。这只是关于语法的问题。例如,参见 #12105#1206
我会保持开放,以防 @griesemer 有其他补充。

u5rb5r59

u5rb5r592#

这可能自gofmt的早期阶段以来就一直是这样。为了比较,各种表达式的格式化:

x = 1 * 2
x = (1 * 2)
x = f(1 * 2)
x = g(1, f(1*2))

我同意在复合字面量元素列表和参数列表之间几乎没有区别,这是一个不一致之处。
我们不清楚是否应该改变它,因为这可能会引起相当大的混乱。如果我们这样做,我们可能希望将其与一些更多的gofmt清理/改进结合起来。

bmvo0sr5

bmvo0sr54#

在赋值中连接字符串需要在 + 周围加上空格,同样地,对于只有一个参数的函数调用内部,如果有 , ,那么 + 就不能有空格。

klsxnrf1

klsxnrf15#

以下是关于该问题的粗糙补丁。它可以通过一个相对任意的 "-o" 选项启用。就我个人而言,我认为 gofmt 应该有一个可配置的样式选项库,然后暴露每个预定义选项,以便它们可以被修改。例如,--style-rules +spacesAroundBinaryOps,-keepSingleLineBlocks,+somethingElse 或者甚至更全面类似 astyle 's options 的东西。试图向大众精确地说明你的代码应该如何格式化是一种不好的做法。标准和风格指南没有问题,但不允许有替代方案会显得有点专制或僵化。

0yg35tkg

0yg35tkg6#

我刚刚遇到了这个问题,是因为我在处理合并请求时,经理指出了代码中所有压缩在一起的+操作符。我几乎完全遵循gofmt的规定,实际上通过一些探测和查找,我发现这种不想要的压缩(我认为大多数人都会同意它不太易读)只发生在函数调用的参数列表内部,而且只有当有多个参数时才会发生。

我想逻辑是这样的:这可以更清晰地分组参数,但我认为不应该这样做。我也认为它不会像它(据我所知)那样破坏太多的代码,因为它只影响函数调用和结构化字面量(我认为也包括结构体和切片字面量)。

我正在努力说服我的经理,gofmt解决的问题比它创造的问题要多,我不认为这是一个高优先级的问题。无论如何,许多Go用户在运行linter之前使用gofmt作为准备工作,但只有linters会破坏CI/CD管道,但是,由于这是一个普遍的、尽管微不足道的变化,我可以理解为什么有人认为这是一个2.0版本的改变。但是,由于gofmt已经实现了这一点,我怀疑没有一个linter会将这种连接作为错误标记。

相关问题