常量

golang常量指的是变异期间就已经知道且不可改变的值。常量可以是数值类型(包括整型,长整型和复数类型),布尔类型,字符串类型。

字面常量

所谓字面常量(literal),是指城中硬编码的常量,如:

-12
3.1415692653  //浮点类型的常量
3.2+12i //复数类型的常量
true //布尔类型的常量
"foo" //字符串类型的常量

在其他语言中,常量通常有特定的类型,比如-12在C语言中会认为是一个int类型的常量。如果要指定一个值为-12的long类型常量,需要携程-12l,这有蒂娜违反人们的直观感觉。Golang的字面常量更接近我们自然语言中的常量概念,它是无类型的。只要这个常量在相应的类型的值域范围内,就可以作为该类型的常量,比如上面的-12,它可以赋值给int,uint,int32,int64,float32,float64,complex64,complex128等类型的变量。

常量定义

通过const关键字,你可以给字面常量一个友好的名字:

const Pi=3.141582653
const zero=0.0. //无类型的浮点常量

const (
    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"

golang的常量定义可以限定类型,但是非必须。如果定义常量的时候没有指定类型,那么它与字面常量一样,是无类型常量

常量的定义的右值也可以是一个在编译期运算的常量表达式,如:

const mask = 1 << 3

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

const Home = os.GetEnv("HOME")

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

预定义常量

golang预定义了这些常量:truefalseiota

iota比较特殊,可以被认为是一个可被编译器修改的常量,在每一个const关键字出现的时候都会被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增1.

从以下的例子基本可以弄清iota的用法:

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

const (
    a =1 << iota //a==1 (iota在每个const开头被重置为0)
    b =1 << iota //b==2
    c =1 << iota //c==4
)

const (
    u      = iota*42 // u==0
    v      = iota*42  //v==42
    w      = iota*42  //w==84
)

const x =iota    //x==0 被重置为0
const y = iota   //y==0 被重置为0

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

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

const (
    a = 1 << iota //a==1 (iota在每个const开头被重置为0)
    b              //b==2
    c                //c==4
)

枚举

枚举值一系列相关的常量,比如下面关于一个星期中每天的定义。通过上面的例子,我们看到可以用在const后跟一对圆括号的方式定义一组常量,这种定义法在golang中通常用于定义枚举值。golang并不支持众多其他语言明确支持的enum关键字

const (
    Sunday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    numberOfDays   //这个常量没有导出
)

同golang的其他符号(symbol)一样,以大写字母开头的常量在包外可见 上面的numberOfDays为包内私有,其他符号则可被其他包访问。

results matching ""

    No results matching ""