【发布时间】:2022-01-06 03:55:57
【问题描述】:
下面的代码
const s = "golang.go"
var a byte = 1 << len(s) / 128
a 的结果是 4。但是,将const s 更改为var s 后如下
var s = "golang.go"
var a byte = 1 << len(s) / 128
a 的结果现在是 0。
还有其他测试代码如下
const s = "golang.go"
var a byte = 1 << len(s) / 128 // the result of a is 4
var b byte = 1 << len(s[:]) / 128 // the result of b is 0
var ss = "golang.go"
var aa byte = 1 << len(ss) / 128 // the result of aa is 0
var bb byte = 1 << len(ss[:]) / 128 // the result of bb is 0
在评估s[:]的长度时,b 为 0 很奇怪
我试着按照golang spec来理解它
如果 s 是字符串常量,则表达式 len(s) 是常量。如果 s 的类型是数组或指向数组的指针并且表达式 s 不包含通道接收或(非常量)函数调用,则表达式 len(s) 和 cap(s) 是常量
但我失败了。有人可以更清楚地向我解释一下吗?
【问题讨论】: