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 的回答。
时间: 2024-11-04 16:14:12