这几天正巧有朋友去面试,回来聊了聊,说起面试时被问到Golang 常量 const的事儿。我一听乐了,这个话题其实很有意思,今儿个咱们就一块来瞅瞅,不讲大道理,直接从实际下手,省得看着头疼。
首先说什么是常量。顾名思义,常量就是固定不变的东西,通常我们在程序中不希望某些值来回变化,就把它们定义成常量。Golang里用的是const
关键字,简单粗暴。声明常量不难,比如:
go
const pi = 3.14159
这个 pi
呢,代表圆周率,你既然用了const
,那它就是板上钉钉的东西,甭想在程序中再去改它。
有的人问了,常量只可以是数字吗?其实不止。常量类型可以是布尔值、字符串、数字这些常见的类型,关键一点是,常量定义时必须得赋值,不能敷衍了事。例如:
go
const isTrue = true
const hello = "你好,世界"
这样一来,它们都会变成编译时的固定值,根本无法改动。
要特别注意的是,Golang里常量不需要显式指定类型。它会在赋值时自动判断。这点和小时候爸妈给我买衣服,自己不用挑样式一个道理,省事儿。但你知道它背后自己默默地判断了一回。
比如上边的 pi
,程序会自动当它是 float64
类型。这是语言的默认机制,你愿意也可以自己给它指定类型,好像下面这样做:
go
const pi float64 = 3.14159
结果是一样的。有人觉得,这样不是多此一举嘛?实际上,特定场合下自定义类型会让代码更直观一些。像你画一幅画,不见得每个细节都按最省事的方法来,怎么顺眼怎么弄。
说道这儿,有人不禁问了,要是一组常量怎么表示呢?别急,继续讲。假如说你要弄一周的天数,可以用常量组,比如:
go
const (
Sunday = 0
Monday = 1
Tuesday = 2
// 继续往下写...
)
这样定义不仅简洁,看得人也清楚,维护起来更省心。尤其组里值多的时候,会很直观。否则一个一个写在外面容易乱,看花了眼。
此外,iota 这个关键字常常出现在const
的使用中。它是干嘛的呢?可以理解成是一个计数器,每遇到一次const
,它就自增1,通常用于枚举场景。且看下面这个例子:
go
const (
A = iota // 0
B // 1
C // 2
)
看出来了吧?只要定义了iota
,随后的常量就自动编号了。关键是,每当进入新的const
块,iota
就重新计数。特别适合搞编号之类的工作。要我总结它,真的有点儿像一个默默无闻却又非常重要的勤杂工,省去你多少事儿。
各位一定心里留个底,常量的计算是编译期的。简单说就是你不运行程序的时候,值都已经确定了,不会等到程序执行时才想着分配值,Golang觉得这样子效率不高,可能就是为了这种速度快吧。像这些东西也经常在面试时冒出来考验应聘者的基本功。常量的这几个玩法会让你在工程实践中不那么手足无措。
其实回头想想,const
只是个普普通通的语言机制,但它却可以帮你大幅提高程序的可维护性。心里一次记住一点,上手时不可能突然卡住。正是因为Golang有这样的设计,越是使用过程中体会到的简单和贴心。