golang常量的用法以及特别之处

465 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

golang常量的用法以及特别之处

常量的声明

goland中常量的声明有两种方法: 单个声明和批量声明

const max = 1e7
const (
   min = -1e4
   zero = 0.0
)

常量声明时需要注意是否是一个已经确定的值,否则会在编译期间报错.

  • go语言常量要是编译时就能确定的数据,不能赋值不确定的值,存储在常量中的数据类型只可以是 不能存在任何可变元素的值。所有常量的运算都可以在编译期完成,这样不仅可以减少运行时的工作,也方便其他代码的编译优化,当操作数是常量时,一些运行时的错误也可以在编译时被发现,例如整数除零、字符串索引越界、任何导致无效浮点数的操作等。
  • 比如下面一个例子: image.png 像这种不能直接被确定的值,在编译期间就无法通过。

go语言常量特殊之处

虽然一个常量可以有任意有一个确定的基础类型,例如int或float64,但是许多常量并没有一个明确的基础类型。编译器为这些没有明确的基础类型的数字常量提供比基础类型更高精度的算术运算;你可以认为至少有256bit的运算精度。这里有六种未明确类型的常量类型,分别是无类型的布尔型、无类型的整数、无类型的字符、无类型的浮点数、无类型的复数、无类型的字符串。

const min = math.MinInt
const max = math.MaxInt

func main() {
   fmt.Printf("min的类型为:%T, min是否为整性: %v\n", min, min == int(min))
   fmt.Printf("max的类型为:%T, max是否为整性: %v\n", max, max == int(max))
}

输出结果:
min的类型为:int, min是否为整性: true
max的类型为:int, max是否为整性: true

image.png 从IDE上可以看到返回的类型为无类型整数,但是输出结果显示依旧是int类型。但是在名称上仍然不能称之为int类型。只能称其为无类型整数(参考牛客网go语言试题)。

常量使用的小技巧

在Go中,常量是在编译时创建的,永远不能更改,而函数参数必须在运行时随每次调用而更改。 因此常量可以提高程序的效率,减少代码的调用次数.比如在一个函数中调用一个具体的已经在编译期间能够被确定的值,每次调用函数都会重新声明一次该值。当使用常量进行替换的时候,就不需要每次调用函数时重新声明了。创建常量的价值是可以快速理解值的含义,有时还可以帮助提高性能。

golang中与常量搭配使用的iota

iota只能被用在常量的赋值中,在每一个const关键字出现时,被重置为0,然后每出现一个常量,iota所代表的数值会自动增加1,iota可以理解成常量组中常量的计数器,不论该常量的值是什么,只要有一个常量,那么iota 就加1。

const a = iota
const (
   b = iota
   c
   d = 100
)

func main() {
   fmt.Println("a: ", a)
   fmt.Println("b: ", b)
   fmt.Println("c: ", c)
   fmt.Println("d: ", d)
}

运行结果:
a:  0
b:  0  
c:  1  
d:  100

如果中间有重新定义const,则iota会失去枚举的效果,重新初始化为0,并且优先输出赋值结果。

const (
   a = 100
   e
   b = iota
   c
   d
   _
   g
)

func main() {
   fmt.Println("a: ", a)
   fmt.Println("e: ", e)
   fmt.Println("b: ", b)
   fmt.Println("c: ", c)
   fmt.Println("d: ", d)
   fmt.Println("g: ", g)
}
运行结果:
a:  100
e:  100
b:  2  
c:  3  
d:  4  
g:  6 

使用下划线或者手动赋值可以暂时跳过iota的赋值并且不会使iota进行初始化,手动给iota初始值进行赋值也可以改变iota枚举赋值的结果.

注: iota只能在常量的表达式中使用。

省流总结:

  1. golang中的常量只能赋值为在编译期间已经被确定了的值,不能为可变元素.
  2. golang中常量命名的叫法为无类型...而不是整型、浮点型等等.
  3. golang中合理的在函数中运行常量可以提高效率.
  4. golang中iota可以作为枚举来使用.