为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕斯709654 2023-08-07 14:36:52
我的理解是 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}
查看完整描述

1 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

目的是强制执行布局规则:

gofmt 是一个漂亮的打印机,其目的是强制执行布局规则;它取代了通常允许解释的“该做和不该做”的概要。

下面是来自go/printer/nodes.go 的格式化摘录,详细介绍了格式化规则:

格式化二进制表达式:确定截止值,然后格式化。我们将深度 == 1 称为普通模式,将深度 > 1 称为紧凑模式。(Russ Cox 的算法建议。)

优先顺序是:      5             *  /  %  <<  >>  &  &^      4             +  -  |  ^      3             ==  !=  <  <=  >  >=      2             &&      1             ||

唯一的决定是第 4 层和第 5 层周围是否有空格。第 6 层(一元)永远没有空格,而第 3 层及以下层始终有空格。

要选择截止值,请查看整个表达式,但不包括主要表达式(函数调用、带括号的表达式),并应用以下规则:

  1. 如果存在带有右侧一元操作数的二元运算符,如果没有空格就会发生冲突,则截止必须是(按顺序):

   /* 6   
   && 6   
   &^ 6   
   ++ 5   
   -- 5

(比较运算符周围总是有空格。)

  1. 如果混合使用 5 级和 4 级运算符,则正常模式下的截止值为 5(使用空格来区分优先级),而紧凑模式下的截止值为 4(从不使用空格)。

  2. 如果没有 4 级运算符或没有 5 级运算符,则正常模式下的截止值为 6(始终使用空格),紧凑模式下的截止值为 4(从不使用空格)。


查看完整回答
反对 回复 2023-08-07
  • 1 回答
  • 0 关注
  • 57 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信