一尘不染

去扫描仪-空格是否正确?

go

Go扫描程序包中text/scanner/scanner.go使用技巧来查找空白:

const GoWhitespace = 1<<'\t' | 1<<'\n' | 1<<'\r' | 1<<' '

然后:

// skip white space
for s.Whitespace&(1<<uint(ch)) != 0 {
    ch = s.next()
}

由于字符值向左移超过31,因此在某些情况下这不是唯一的吗?我的意思是,当某些char与制表符模数32相同时,它将被识别为空格吗?


阅读 324

收藏
2020-07-02

共1个答案

一尘不染

完全答案:

Spec明确表示,对于无符号操作,我们会屏蔽掉高位,因此低位实际上是“环绕”的。

它起作用的原因是:

  1. Scanner.Whitespace实际上uint64GoWhitespace完全适合的价值
  2. s.Whitespace&(1<<uint(ch))在运行时对无符号整数进行的运算可以具有任意大的中间值,并且会回绕。因此,如果说char为“ a”(96),我们就会1 << 96溢出,因此64位int的模大小为0。
2020-07-02