Go101 作者发布了一道有意思的题目,这道题主要考察细节点,Go101 这本书也是以抠细节著称。看看这道题,以下程序输出什么?(单选)
package main
const s = "Go101.org"
// len(s) == 9
// 1 << 9 == 512
// 512 / 128 == 4
var a byte = 1 << len(s) / 128
var b byte = 1 << len(s[:]) / 128
func main() {
println(a, b)
}
- A、0 0
- B、0 4
- C:4 0
- D:4 4
这里共有2个知识点:
-
len(s)
- 若s为字符串常量或者简单的数组表达式,则len返回的为int型的常量
- 若s为不为上述情况(有函数计算、通道等),则len返回的为int型的变量
-
关于位移操作
- 如果常量位移表达式 的左侧操作数是一个无类型常量,那么其结果是一个整数常量;否则就是和左侧操作数同一类型的常量(必须是 整数类型 )
- 如果一个非常量位移表达式的左侧的操作数是一个无类型常量,那么它会先被隐式地转换为假如位移表达式被其左侧操作数单独替换后的类型
回到题目
const s = "Go101.org" // 声明了一个string常量s
len(s) = 9 // len(string常量s) len返回的为int型的常量
len(s[:]) = 9 // len(string常量s的切片 ) len返回的为int型的变量
1 << int型的常量 // 常量 位移表达式
1 << int型的变量 //非 常量 位移表达式
常量 位移表达式的结果为整数常量
非常量 位移表达式 的结果要看左侧的操作数的类型。
如果左侧的操作数有类型,结果为原类型
若左侧的操作数无类型,结果为左侧的类型将被隐式转化为要赋值变量的类型。
该题目为byte
这里
byte 1 << int 9 结果为 byte 512 越界了, = 0
0 / 9 = 0 因此输出结果 b = 0