284-Go语言的常量

我会带着你远行 2023-01-15 02:19 347阅读 0赞

Go语言的常量

在Go语言中,常量是指编译期间就已知且不可改变的值。常量可以是数值类型(包括整型、浮点型和复数类型)、布尔类型、字符串类型等。

字面常量

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

  1. -12
  2. 3.14159265358979323846 // 浮点类型的常量
  3. 3.2+12i // 复数类型的常量
  4. true // 布尔类型的常量
  5. "foo" // 字符串常量

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

常量定义

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

  1. const Pi float64 = 3.14159265358979323846
  2. const zero = 0.0 // 无类型浮点常量
  3. const (
  4. size int64 = 1024
  5. eof = -1 // 无类型整型常量
  6. )
  7. const u, v float32 = 0, 3 // u = 0.0, v = 3.0,常量的多重赋值
  8. const a, b, c = 3, 4, "foo"
  9. // a = 3, b = 4, c = "foo", 无类型整型和字符串常量

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

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

  1. const mask = 1 << 3

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

  1. const Home = os.GetEnv("HOME")

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

相对于变量,常量是恒定不变的值,多用于定义程序运行期间不会改变的那些值。常量的声明使用 const。常量在定义的时候必须赋值
在这里插入图片描述
可以一次性声明多个常量,如下
在这里插入图片描述const 同时声明多个常量时,如果省略了值则表示和上面一行的
值相同。 例如

在这里插入图片描述

预定义常量

Go语言预定义了这些常量:true、false和iota。

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

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

iota 是 go 语言的常量计数器,只能在常量的表达式中使用。当它
遇到 const 时,值会自动置为 0。

  1. const ( // iota被重设为0
  2. c0 = iota // c0 == 0
  3. c1 = iota // c1 == 1
  4. c2 = iota // c2 == 2
  5. )
  6. const (
  7. a = 1 << iota // a == 1 (iota在每个const开头被重设为0)
  8. b = 1 << iota // b == 2
  9. c = 1 << iota // c == 4
  10. )
  11. const (
  12. u = iota * 42 // u == 0
  13. v float64 = iota * 42 // v == 42.0
  14. w = iota * 42 // w == 84
  15. )
  16. const x = iota // x == 0 (因为iota又被重设为0了)
  17. const y = iota // y == 0 (同上)

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

  1. const ( // iota被重设为0
  2. c0 = iota // c0 == 0
  3. c1 // c1 == 1
  4. c2 // c2 == 2
  5. )
  6. const (
  7. a = 1 <<iota // a == 1 (iota在每个const开头被重设为0)
  8. b // b == 2
  9. c // c == 4
  10. )

在这里插入图片描述
思考如下,n1,n2,n3 的值
例子1:
在这里插入图片描述
在这里插入图片描述
例子2:
在这里插入图片描述
在这里插入图片描述
例子3:
在这里插入图片描述
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,347人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Go语言常量和iota

    `一.常量概述` > 常量是一个固定值,在编译器就确定结果.声明时必须赋值且结果不可以改变. > 因为常量在编译器就确定,可以防止程序运行过程中意外修改 >

    相关 284-Go语言常量

    Go语言的常量 在Go语言中,常量是指编译期间就已知且不可改变的值。常量可以是数值类型(包括整型、浮点型和复数类型)、布尔类型、字符串类型等。 字面常量 所谓字面

    相关 Go语言基础】变量和常量

    用Go语言编写的程序都是从基本组件构成,而构成这些基本组件的是标识符,本章中将介绍到Go语言中使用到变量,常量以及基本数据类型。 1. 标识符 标识符是函数、变量、常量

    相关 Go语言笔记--常量与运算符

    1.常量的定义 1)常量的值再编译时就已经确定 2)常量的定义格式与变量基本相同 3)等号右侧必须是常量或者常量表达式 4)常量表达式中的函数必须是内置函数 例如