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 的回答。

时间: 2024-11-04 16:14:12

golang 常量的疑问的相关文章

[疑问]静态变量访问

今天写聊天程序,端口同时只能占用一次, 每新建一个对话窗口,就需要给这个窗口分配udp.send()和udp.receive() //可能有更好的方法,我这里暂时先这么做 我想的是给把send()和receive()写成静态函数; 另一个是client声明成静态的,这样对话框类里就可以每次实例化一个UDP对象 了        // 先不管方法的优劣,我只是想知道每次这样端口还会不会提示重复占用 换句话说,我知识想知道静态对象访问的机制. 感觉是有问题的.... 用常量吧 [疑问]静态变量访问

Google资深工程师深度讲解Go语言☆

准备工作 ######课程导读: Go语言的历史起源??? 为什么会有Go出现?? Go的发展趋势?? 怎么样学习Go?? ######安装与环境: 视频地址:安装与环境 ######Go的参考资料汇总:1.GO语言零基础入门资料整理2.Restful接口开发(PHP)3.Go入门指南4.Learngobyexample 巩固语法基础的Demo,初学者“抄”(学习)代码的地方5.Go 初学者成长之路6.Go 标准库中文文档7.<编程之法:面试和算法心得>8.目录: 第1章 课程介绍    欢迎

golang语言学习第二课:变量类型及常量与枚举

go语言的变量类型: bool (true为0,false不等于0), string int 分好多种int,有点头晕,但用默认的int就足够了,根据机器判断,是32位的用int32,是64位的用int64. byte, 又是uint8的别名. rune(类似char,但是是utf-8编码的char),又是int32的别名. go语言没有float,只有float32, float 64(即使在32位的架构上还是64位) go语言原生支持复数类型,类似python, python也支持复数.go

Golang学习笔记(3)---go语言变量、常量的定义及赋值

单个变量的赋值与声明 变量的声明格式:var  <变量名称>  <变量类型> 变量的赋值格式:<变量名称> = <表达式> 声明的同时赋值:var <变量名称> [变量类型] = <表达式> <变量名> := <变量值>  --->只能在函数体内使用 多个变量的复制与声明 全局变量的声明可以使用var()的方式简写 全局变量的声明不可以省略var,但可使用并行的方式 所有变量都可以使用类型推断 并行方式的

golang 声明常量

*声明一个常量 const MAX = 4096 *声明一个指定类型的常量 const LIMIT int16 = 1024 const LIMIT2 = int16(1024) *声明一组常量 const (     start  = 0x1      resume = 0x2      stop   = 0x4  ) *声明一组指定类型的常量 const (     start  int8 = 0x1      resume int8 = 0x2      stop   int8 = 0x4

换个语言学一下 Golang (4)——变量与常量

一.变量定义 所谓的变量就是一个拥有指定名称和类型的数据存储位置. //看一个例子 package main import ( "fmt" ) func main() { var x string = "hello world" fmt.Println(x) } 变量的定义首先使用var关键字,然后指定变量的名称x,再指定变量的类型string,在本例中,还对变量x进行了赋值,然后在命令行输出该变量.Go这种变量定义的方式和其他的语言有些不同,但是在使用的过程中,你

E 01 Golang语言之变量和常量

标识符与关键字 Ⅰ.标识符 在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名.常量名.函数名等等. Go语言中标识符由字母数字和_(下划线)组成,并且只能以字母和_开头. 举几个例子:abc, _, _123, a123. Ⅱ.关键字 关键字是指编程语言中预先定义好的具有特殊含义的标识符. 关键字和保留字都不建议用作变量名. Go语言中有25个关键字: break default func interface select case defer go map struct chan

不得不知道的golang之sync.Mutex互斥锁源码分析

针对Golang 1.9的sync.Mutex进行分析,与Golang 1.10基本一样除了将panic改为了throw之外其他的都一样.源代码位置:sync\mutex.go.可以看到注释如下: Mutex can be in 2 modes of operations: normal and starvation. In normal mode waiters are queued in FIFO order, but a woken up waiter does not own the m

Java程序员的Golang入门指南(上)

Java程序员的Golang入门指南 1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如果有人说X语言比Y语言好,两方的支持者经常会激烈地争吵.如果你是某种语言老手,你就是那门语言的"传道者",下意识地会保护它.无论承认与否,你都已被困在一个隧道里,你看到的完全是局限的.<肖申克的救赎>对此有很好的注脚: [Red] These walls are funny.