golang 常量的疑问

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "reflect"
 6 )
 7 
 8 const (
 9     cmask  = 127
10 )
11 
12 func main() {
13     var u uint8
14     u = 22
15     r1 := u + cmask
16     fmt.Println(r1)
17     fmt.Println(reflect.TypeOf(cmask)) // int
18     //------------------
19     mask := 0x7f
20     //r2 := u + mask
21     //fmt.Println(r2)
22     fmt.Println(reflect.TypeOf(mask)) // int
23 }

为什么反射出来的类型都是 int,cmask 可以与 u 进行操作 , 而 mask 不行?  望高手解答

 

原因详见 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 不兼容而报错。

感谢  SegmentFault 上 huandu 的回答。

posted @ 2015-01-08 15:16  yumuxu  阅读(180)  评论(0编辑  收藏  举报