cmd/gofmt: slice of structs not consistently formatted

xmakbtuz  于 4个月前  发布在  Go
关注(0)|答案(7)|浏览(55)

See https://play.golang.org/p/uwG_GFPiU13 .
I expected the literal to be reformatted like this:

package main

func main() {
	_ = []struct{ a int }{
		{
			a: 1,
		},
		{
			a: 2,
		},
		{
			a: 3,
		},
	}
}

instead, it preserves the previous formatting.

package main

func main() {
	_ = []struct{ a int }{
		{
			a: 1,
		},
		{
			a: 2,
		}, {
			a: 3,
		},
	}
}

Is this intentional? Or does it make sense to keep the formatting of structs in the slice the same?

ou6hu8tu

ou6hu8tu2#

},
{

}, { 都是允许的。
为了让不同的样式在单个声明中归为一个,我们需要跟踪大括号及其位置,然后可能需要回溯并更改标记位置。
由 Robert 决定是否执行此操作。

j2qf4p5b

j2qf4p5b3#

我个人认为如果它不会给gofmt增加太多复杂性,那么这将是很好的。

2nbm6dog

2nbm6dog4#

很高兴拥有,但要正确使用却很复杂。一般来说,在接受多种格式的情况下,我们会将决定权交给用户。

x3naxklr

x3naxklr5#

我已经在mvdan/gofumpt@5d37481实现了一个原型,如果有人想玩的话。解决方案非常简单,但我已经有一些逻辑来判断复合字面量在其元素之间是否有任何换行符。

qojgxg4l

qojgxg4l6#

感谢您对此进行工作!
我尝试了mvdan/gofumpt@5d37481,但它强制执行

},
{

在所有情况下都应用。例如,对我来说,上面的文字没有明显地被重新格式化为

_ = []struct{ a int }{
    {a: 1},
    {
        a: 2,
    },
    {
        a: 3,
    },
}

。什么会被确定为一致的风格?我能想到的唯一一个是列表中第一个元素的风格会被应用到后续元素上。

c2e8gylq

c2e8gylq7#

感谢报告,@smasher164。让我们将此问题提交给 mvdan/gofumpt#36 ,因为该错误与 gofmt 无关。

相关问题