Go 常量的类型

gopackage 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 不行 ???

阅读 4k
1 个回答

原因详见 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),因此会因为 intuint8 不兼容而报错。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题