Go fmt 为数学表达式生成格式不一致的结果

我的理解是 go fmt 应该生成可读且格式一致的代码。但我认为情况并非如此。


我输入了注释的代码,然后 go fmt 返回了未注释的代码。为什么它倒塌了0.5*(y3-y0),却没有倒塌0.5 * (y2 - y0)?怎样才算一致呢?而且,在我看来,几乎所有空间都塌陷的返回线是一场可读性灾难。


不一致是一个错误吗?有没有办法让 go fmt 单独保留某些线路(例如返回线路)?


func cubicInterpolate(x, y0, y1, y2, y3 float64) float64 {

    // 4-point, 3rd-order Hermite (x-form)

    // c0 := y1

    // c1 := 0.5 * (y2 - y0)

    // c2 := y0 - 2.5 * y1 + 2. * y2 - 0.5 * y3

    // c3 := 1.5 * (y1 - y2) + 0.5 * (y3 - y0)

    //

    // return ((c3 * x + c2) * x + c1) * x + c0


    c0 := y1

    c1 := 0.5 * (y2 - y0)

    c2 := y0 - 2.5*y1 + 2.*y2 - 0.5*y3

    c3 := 1.5*(y1-y2) + 0.5*(y3-y0)


    return ((c3*x+c2)*x+c1)*x + c0

}


慕斯709654
浏览 62回答 1
1回答

临摹微笑

目的是强制执行布局规则:gofmt 是一个漂亮的打印机,其目的是强制执行布局规则;它取代了通常允许解释的“该做和不该做”的概要。下面是来自go/printer/nodes.go 的格式化摘录,详细介绍了格式化规则:格式化二进制表达式:确定截止值,然后格式化。我们将深度 == 1 称为普通模式,将深度 > 1 称为紧凑模式。(Russ Cox 的算法建议。)优先顺序是:      5             *  /  %  <<  >>  &  &^      4             +  -  |  ^      3             ==  !=  <  <=  >  >=      2             &&      1             ||唯一的决定是第 4 层和第 5 层周围是否有空格。第 6 层(一元)永远没有空格,而第 3 层及以下层始终有空格。要选择截止值,请查看整个表达式,但不包括主要表达式(函数调用、带括号的表达式),并应用以下规则:如果存在带有右侧一元操作数的二元运算符,如果没有空格就会发生冲突,则截止必须是(按顺序):   /* 6       && 6       &^ 6       ++ 5       -- 5(比较运算符周围总是有空格。)如果混合使用 5 级和 4 级运算符,则正常模式下的截止值为 5(使用空格来区分优先级),而紧凑模式下的截止值为 4(从不使用空格)。如果没有 4 级运算符或没有 5 级运算符,则正常模式下的截止值为 6(始终使用空格),紧凑模式下的截止值为 4(从不使用空格)。
打开App,查看更多内容
随时随地看视频慕课网APP