我有一个Go程序,可以对字符串常数的长度执行移位和除运算,但输出并不是我所期望的.下面是代码:
package main
import "fmt"
const s = "123456789" // len(s) == 9
// len(s) is a constant expression,
// whereas len(s[:]) is not.
var a byte = 1 << len(s) / 128
var b byte = 1 << len(s[:]) / 128
func main() {
fmt.Println(a, b) // outputs: 4 0
}
在该程序中,a和b是使用涉及位移动和除除的类似公式计算的.然而,a和b的输出分别为4和0,这似乎违反直觉,因为这两个操作涉及相同的字符串长度和相似的算术.有人能解释一下为什么a和b会产生不同的结果吗?
- 在这种情况下,除以128和位转移有什么作用?
- 为什么len(s[:])被认为不是一个常数表达,这如何影响判断?
如果能深入了解这些表达如何以不同的方式判断以及为什么它们会在Go中导致不同的输出,我将不胜感激.