专栏首页python3【Go语言】【3】GO语言常量

【Go语言】【3】GO语言常量

  通常情况下语言入门前会讲一堆背景和特性,目的是为了能让学习者对该语言有一个大概的认识,但这里我想直接进入细节,不是因为任性,而是因为常量是编程语言最基本的组成元素,这与语言背景无关。

一、字面常量

在说明字面常量之前先说一下魔鬼数字,哪么什么是魔鬼数字呢?

func calculatePrice(price float32) float32{

  return price * 0.8

}

这个方法中的0.8就是魔鬼数字(没有具体含义),它导致代码难以理解,这里的0.8表示折扣的意思,为了清晰起见,上面的代码可以如下修改:

const discount float64 = 0.8 // 定义折扣常量

func calculatePrice(price float32) float32{ // 计算折扣后的价格

  return price * discount

}

这个例子中的魔鬼数字就是字面常量的一种,除了浮点型之外,还可以有整型、布尔型、字符串型等字面常面,如:

3.1415926535897932 // 浮点类型的字面常量

-12           //整数类型的字面常量

true          //布尔类型的字面常量

"ok"          //字符串类型的字面常量

当然GO还有复数常量,如3+2i

二、常量

和其它语言(C、C++、Java等)类似,由const关键字修饰,例如:

const PI float64 = 3.1415926535897932

const EluerE float64 = 2.718281828459045

const value int = -12

const width int = 36

const flag bool = false

const isRead bool = true

const str string = "ok"

const bookName string = "Go language"

const rect complex64 = 3 + 2i

const area complex64 = 3.1415 + 3.6i

每个常量定义的形式都必须写成const constName constType = constValue这种形式吗?我们是否能省略掉常量类型?当然可以,要知道GO语言是最懂程序员的哟 :)

const PI = 3.1415926535897932

const EluerE = 2.718281828459045

const value = -12

const width = 36

const flag = false

const isRead = true

const str = "ok"

const bookName = "Go language"

const rect = 3 + 2i

const area = 3.1415 + 3.6i

每个常量定义都要写一次const,是否能省略掉const?这个是不可以的,但可以把上面的定义写成如下形式:

const (

    PI = 3.1415926535897932

    EluerE = 2.718281828459045

    value = -12

    width = 36

    flag = false

    isRead = true

    str = "ok"

    bookName = "Go language"

    rect = 3 + 2i

    area = 3.1415 + 3.6i

)

这样写虽然少写了const,但代码行数并没有减少,所以也可以缩写为:

const (

   PI, EluerE, value, width, flag, isRead, str, bookName, rect, area = 3.1415926535897932, 2.718281828459045, -12, 36, false, true, "ok", "Go language", 3 + 2i, 3.1415 + 3.6i

)

三、常量特点说明

1、没有private、protected、public修改符

有过Java开发经验的读者都清楚private、protected、public修饰符,但GO对你说sorry。GO是怎么区分常量/变量是对内还是对外的呢?

答案是常量名的首字母是否大写,若首字母大写则是对外的,首字母小写则是对内的,上例中的PI、EluerE就相当于public的,而value、width、flag、isRead等就相当于private

2、类型放在常量名的后面

有过Java开发经验的读者都比较熟悉public int value = 10这种定义方式,类型放在变量名value的前面,但GO恰恰相反,偏偏把类型放在后面,例如:const PI float64 = 3.1415926535897932

3、常量定义语句不用分号结束

在Java或C等语言中,一般都是这样定义:const str string = "ok";但在GO中懒得把分号(;)都省略了。刚开始写GO代码很不习惯,总是在后面追加一个分号,然而一保存Sublime text很贴心地帮我省略掉了

4、常量定义的右值可以是一个编译期运算的常量表达式

例如:

const algorithm = 255 >> 2

这点与其它语言类似,也容易理解,若右值是运行期才能得到的结果表达式

const Port = os.GetEnv("Port")

那么在编译期并不能确定该值,会出现编译错误

四、预定义常量iota

iota是GO所特有的,它在每个const出现时被重置为0,下一个const出现之前,每出现一次iota,其所代表的数字自动增加1,那么怎么理解这句话呢?

【例1】:我们定义一个星期的枚举常量

const (

    Sunday    = iota  //星期天

    Monday    = iota  //星期一

    Tuesday   = iota   //星期二

    Wednesday = iota   //星期三

    Thursday  = iota   //星期四

    Friday    = iota  //星期五

    Saturday  = iota   //星期六

)

当每个const出现时iota被重置为0,所以这里的Sunday值为0,同时后面没有再出现const,所以第二个iota自动加1,Monday的值为1,依次类推,Saturday的值为6

值得一提的是,上面的写法可以简写如下:

const (

    Sunday = iota  //星期天

    Monday       //星期一 

    Tuesday      //星期二

    Wednesday     //星期三

    Thursday     //星期四

    Friday       //星期五

    Saturday     //星期六

)

【例2】:修改一下这个枚举定义

const (

    Sunday  = iota //星期天,赋值为0

    Monday  = iota //星期一

    Tuesday = iota //星期二

)

const (

    Wednesday = iota //星期三,赋值为0

    Thursday  = iota //星期四

    Friday    = iota //星期五

    Saturday  = iota //星期六

)

当每个const出现时iota被重置为0,所以这里的Sunday,Monday没有const出现,其值自动加1,所以Monday为1,同理Tuesday为2; 

由于Wednesday之前出现了const,所以Wednesday的值被重置为0,而Thursday、Friday、Saturday后面再没有const出现,所以Thursday、Friday、Saturday值自动加1,依次为1、2、3


【编后话】:

开始接触GO,感觉它就是一个大杂烩,里面即有C语言的影子,也有Java语言的影子,也有JavaScript脚本的影子,同时还有Pascal语言的痕迹,但使用使用着感觉这符合人的正常思维,代码想怎么写就怎么写,无论怎么写好像都符合GO的语法。借用知乎用户的话讲:GO语言是一门看似简单实际并不简单,貌似外表丑陋实则另有考究的语言。


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 构造Python中的常量类

    通过命名风格来提示使用者该变量代表的意义为常量,比如MAX_NUMBER、TOTAL。然而这种方式并没有真正实现常量,其对应的值仍然可以被改变,这只是一种约定俗...

    用户2398817
  • 用python,生活仍有诗和远方

    常听说,现在的代码,就和唐朝的诗一样重要。 可对我们来说,写几行代码没什么,但是,要让我们真正地去写一首唐诗,那可就头大了。。既然如此,为何不干脆用代码写一首唐...

    用户2398817
  • eva0.4.1源码看看3

    用户2398817
  • Github 项目推荐 | 无监督神经机器翻译 —— UNdreaMT

    UNdreaMT 是一个开源的无监督神经机器翻译系统,该系统的具体实现方式在以下的论文里有详细地描述:

    AI研习社
  • 金诚同达汪涌:通知删除规则与明知规则的适用关系

    10月24日,由腾讯互联网与社会研究院与《中国版权》杂志社联合主办的“第二届中国互联网新型版权问题研讨会”在京举行。本次论坛的主题是内容聚合与深度链接的法律...

    腾讯研究院
  • 在mac上安装Xgboost Python库

    最近在mac上用到xgboost库,安装时遇到颇多大坑,网上查了很多答案几乎都是win上的问题,没遇到理想的,自己也就摸着石头把几个大坑给填了,总结一下,给后...

    MachineLP
  • FORALL 之 SAVE EXCEPTIONS 子句应用一例

         对于大批量的DML操作中出现的错误,除了使用DML error logging特性来记录在DML期间出现的错误之外,使用批量SQL语句FORALL的S...

    Leshami
  • 安卓得到状态栏高度及各个控件高度

    用户4458175
  • 【DB笔试面试559】在Oracle中,降序索引和升序索引分别是什么?

    对于升序索引(Ascending Indexes),数据库按升序排列的顺序存储数据。索引默认按照升序存储列值。默认情况下,字符数据按每个字节中包含的二进制值排序...

    小麦苗DBA宝典
  • Sqlite数据库使用---基础研究

    和文件相比,sqlite表中存储的是一系列的有规则的数据对象,每个对象都有固定的某些数据。

    fanfan

扫码关注云+社区

领取腾讯云代金券