你正在使用的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),
)
6条答案
按热度按时间ipakzgxi1#
我相信这是有意为之,但与
append
函数本身无关。这只是关于语法的问题。例如,参见 #12105 或 #1206。我会保持开放,以防 @griesemer 有其他补充。
u5rb5r592#
这可能自gofmt的早期阶段以来就一直是这样。为了比较,各种表达式的格式化:
我同意在复合字面量元素列表和参数列表之间几乎没有区别,这是一个不一致之处。
我们不清楚是否应该改变它,因为这可能会引起相当大的混乱。如果我们这样做,我们可能希望将其与一些更多的gofmt清理/改进结合起来。
hiz5n14c3#
相关: #11497
bmvo0sr54#
在赋值中连接字符串需要在
+
周围加上空格,同样地,对于只有一个参数的函数调用内部,如果有,
,那么+
就不能有空格。klsxnrf15#
以下是关于该问题的粗糙补丁。它可以通过一个相对任意的 "-o" 选项启用。就我个人而言,我认为 gofmt 应该有一个可配置的样式选项库,然后暴露每个预定义选项,以便它们可以被修改。例如,
--style-rules +spacesAroundBinaryOps,-keepSingleLineBlocks,+somethingElse
或者甚至更全面类似astyle
's options 的东西。试图向大众精确地说明你的代码应该如何格式化是一种不好的做法。标准和风格指南没有问题,但不允许有替代方案会显得有点专制或僵化。0yg35tkg6#
我刚刚遇到了这个问题,是因为我在处理合并请求时,经理指出了代码中所有压缩在一起的+操作符。我几乎完全遵循gofmt的规定,实际上通过一些探测和查找,我发现这种不想要的压缩(我认为大多数人都会同意它不太易读)只发生在函数调用的参数列表内部,而且只有当有多个参数时才会发生。
我想逻辑是这样的:这可以更清晰地分组参数,但我认为不应该这样做。我也认为它不会像它(据我所知)那样破坏太多的代码,因为它只影响函数调用和结构化字面量(我认为也包括结构体和切片字面量)。
我正在努力说服我的经理,gofmt解决的问题比它创造的问题要多,我不认为这是一个高优先级的问题。无论如何,许多Go用户在运行linter之前使用gofmt作为准备工作,但只有linters会破坏CI/CD管道,但是,由于这是一个普遍的、尽管微不足道的变化,我可以理解为什么有人认为这是一个2.0版本的改变。但是,由于gofmt已经实现了这一点,我怀疑没有一个linter会将这种连接作为错误标记。