Go 语言函数式编程系列教程(二) —— 常量和枚举

栏目: PHP · 发布时间: 4年前

内容简介:在 Go 语言中,常量是指编译期间就已知且不可改变的值,常量只可以是数值类型(包括整型、 浮点型和复数类型)、布尔类型、字符串类型等标量类型。和 PHP 一样,在 Go 语言中,我们可以通过通过结合上篇教程介绍的 Go 语言变量定义方式,可以看到 Go 这种变量和常量的声明方式可读性很好,从左往右,第一个标识符

Go 语言中,常量是指编译期间就已知且不可改变的值,常量只可以是数值类型(包括整型、 浮点型和复数类型)、布尔类型、字符串类型等标量类型。和 PHP 一样,在 Go 语言中,我们可以通过 const 关键字来定义常量(遵循 C 语言的约定)。

常量定义

通过 const 关键字定义常量时,可以指定常量类型,也可以省略(底层会自动推导),常见的常量定义方式如下:

const Pi float64 = 3.14159265358979323846 
const zero = 0.0 // 无类型浮点常量 
const (          // 通过一个 const 关键字定义多个常量,和 var 类似
    size int64 = 1024
    eof = -1  // 无类型整型常量 
) 
const u, v float32 = 0, 3  // u = 0.0, v = 3.0,常量的多重赋值 
const a, b, c = 3, 4, "foo" // a = 3, b = 4, c = "foo", 无类型整型和字符串常量

结合上篇教程介绍的 Go 语言变量定义方式,可以看到 Go 这种变量和常量的声明方式可读性很好,从左往右,第一个标识符 varconst 表明声明的是变量还是常量,第二个标识符标识变量或常量的内存存储块别名,以便后续引用,第三个标识符表示变量或常量的数据类型,可以省略,省略的情况下底层会在编译期自动推导对应的变量或常量类型。

由于常量的赋值是一个编译期行为,所以右值不能出现任何需要运行期才能得出结果的表达式,比如试图以如下方式定义常量就会导致编译错误:

func GetNumber() int {
    return 100
}

const num = GetNumber()

原因很简单, GetNumber() 只有在运行期才能知道返回结果,在编译期并不能确定,所以无法作为常量定义的右值。

此外常量之所以叫常量意思是它的值是恒定不变的,如果你试图在运行时修改常量的值,则会在编译期报错。

预定义常量

Go 语言预定义了这些常量: truefalseiota

前面两个熟悉 PHP 或其他语言的应该都很熟悉, iota 比较特殊,可以被认为是一个可被编译器修改的常量,在每一个 const 关键字出现时被重置为 0,然后在下一个 const 出现之前,每出现一次 iota ,其所代表的数字会自动增 1。

从以下的例子可以基本理解 iota 的用法:

package main

const (    // iota 被重置为 0
    c0 = iota   // c0 = 1
    c1 = iota   // c1 = 2
    c2 = iota   // c3 = 3
)

const (
    u = iota * 2;  // u = 0
    v = iota * 2;  // v = 2
    w = iota * 2;  // w = 4
)

const x = iota;  // x = 0
const y = iota;  // y = 0

如果两个 const 的赋值语句的表达式是一样的,那么还可以省略后一个赋值表达式。因此,上面的前两个 const 语句可简写为:

const ( 
    c0 = iota 
    c1 
    c2 
)

const ( 
    u = iota * 2 
    v 
    w 
)

枚举

此外,常量还可以用于枚举。

枚举中包含了一系列相关的常量,比如下面关于一个星期中每天的定义。Go 语言并不支持其他语言用于表示枚举的 enum 关键字,而是通过在 const 后跟一对圆括号定义一组常量的方式来实现枚举。

注:PHP 本身并不支持枚举,不过我们可以通过 SPL 库提供的 SplEnum 类来实现,此外还有一个第三方扩展包myclabs/php-enum 可用来实现对枚举的支持。

下面是一个常规的 Go 语言枚举表示法,其中定义了一系列整型常量:

const (
    Sunday = iota 
    Monday 
    Tuesday 
    Wednesday 
    Thursday 
    Friday 
    Saturday 
    numberOfDays
)

常量的作用域

和函数体外声明的变量一样,以大写字母开头的常量在包外可见(类似于 public 修饰的类属性),比如上面介绍的 PiSunday 等,而以小写字母开头的常量只能在包内访问(类似于通过 protected 修饰的类属性),比如 zeronumberOfDays 等,后面在介绍包的可见性时还会详细介绍。函数体内声明的常量只能在函数体内生效。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员的数学2

程序员的数学2

平冈和幸、堀玄 / 陈筱烟 / 人民邮电出版社 / 2015-8-1 / CNY 79.00

本书沿袭《程序员的数学》平易近人的风格,用通俗的语言和具体的图表深入讲解程序员必须掌握的各类概率统计知识,例证丰富,讲解明晰,且提供了大量扩展内容,引导读者进一步深入学习。 本书涉及随机变量、贝叶斯公式、离散值和连续值的概率分布、协方差矩阵、多元正态分布、估计与检验理论、伪随机数以及概率论的各类应用,适合程序设计人员与数学爱好者阅读,也可作为高中或大学非数学专业学生的概率论入门读物。一起来看看 《程序员的数学2》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具