转自:http://segmentfault.com/q/1010000002472534
package main
import (
"fmt"
"reflect"
)
const (
cmask = 127
)
func main() {
var u uint8
u = 22
r1 := u + cmask
fmt.Println(r1)
fmt.Println(reflect.TypeOf(cmask)) // int
//------------------
mask := 0x7f
//r2 := u + mask
//fmt.Println(r2)
fmt.Println(reflect.TypeOf(mask)) // int
}
cmask 和 mask 反射出来的类型都是 int。为什么 cmask 可以和u进行操作,而 mask 不行 ???
huandu:
原因详见 Go 的语法说明:
If the expression values are untyped constants, the declared constants remain untyped and the constant identifiers denote the constant values.
换人话来说就是:使用没指定类型的 const,就相当于直接使用它对应的常量。
所以你写 u + cmask 就相当于写了 u + 127,于是不会保存。而 mask 是个普通变量,没有这种特殊待遇,类型是在声明时就固定了(int),因此会因为 int 和 uint8 不兼容而报错。