常量
相对于变量而言,常量是在程序使用过程中,不会改变的数据。有些地方你需要将定义好的常量重复使用,代码中你不允许它的值改变。例如 圆周率 在程序执行过程中不会改变。
常量的声明
const Pi float64 = 3.14
const
声明、Pi
常量、float64
类型、3.14
值
多变量声明
const (
Pi float64 = 3.14 // 定义常量 Pi 类型为 float64 值为 3.14
Pi2 // 未定义类型和值默认取上一条类型和值
Age = 18 // 重新定义类型和值时为 int 值为 18
)
如果未声明常量的类型和值,它将从上一个常量中获取它,在上面 pi2
将会从 pi
上获取类型和值,如果新声明了常量,并且有分配值,它就是新声明的常量。 例如上面的 Age
就是 int
类型的 18
。 如果再继续声明 Age2
不给 Age2
赋初始值的话, 默认就会取上一个 Age
的值和类型。
常量的作用域
常量只能在其声明的范围内使用,如果在一个函数内部作用域中声明的常量与外部名称相同,则只能用自己内部的常量,它将忽略外部的常量。例如:
package main
import "fmt"
// 定义了一个全局常量
const Pi float64 = 3.14
func main() {
// 在 main 函数中定义了一个局部常量
const Pi float64 = 3.1415
// 优先使用局部常量
fmt.Println(Pi)
myfunc()
}
func myfunc() {
// 这里是用全局常量
fmt.Println(Pi)
}
总结一下
- 常量数值不能修改。
- 常量定义后可以不使用。
- 常量定义不能使用简短定义方式。
- 常量种使用的数据类型只能是 整型、布尔、浮点、复数、字符串类型。
iota 特殊的常量
iota
是常量里面的计数器,初始值默认值是0,可以被编译器自动修改,每定义一组常量时,iota
逐行自增1。
package main
import "fmt"
func main() {
const (
a = iota //0
b //1
c //2
d = "ha" //独立值,iota += 1
e //"ha" iota += 1
f = 100 //iota +=1
g //100 iota +=1
h = iota //7,恢复计数
i //8
)
fmt.Println(a,b,c,d,e,f,g,h,i)
}
iota如何使用
Go语言中没有提供像其他语言中的 enum
枚举类型,但是可以使用 const
来模拟枚举类型。iota
可以被用作枚举值。
package main
import (
"fmt"
)
type Mytype int
//定义一个常量 来模拟枚举类型 Spring设置为iota为值默认就是 0
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
numberOfDays
)
func main() {
//打印定义的常量枚举信息Tuesday 值2
fmt.Printf("%v
", Tuesday) //2
}
有趣的的 iota 实例
package main
import "fmt"
const (
i=1<<iota
j=3<<iota
k
l
)
func main() {
fmt.Println("i=",i)
fmt.Println("j=",j)
fmt.Println("k=",k)
fmt.Println("l=",l)
}
以上实例运行结果为:
i= 1
j= 6
k= 12
l= 24
iota
表示从 0 开始自动加 1,所以 i=1<<0
, j=3<<1
(<< 表示左移的意思),即:i=1
, j=6
,这没问题,关键在 k 和 l,从输出结果看 k=3<<2
,l=3<<3
。
简单表述:
- i=1:左移 0 位,不变仍为 1;
- j=3:左移 1 位,变为二进制 110, 即 6;
- k=3:左移 2 位,变为二进制 1100, 即 12;
- l=3:左移 3 位,变为二进制 11000,即 24。
注:<<n==*(2^n)
。
左移运算符 <<
是双目运算符。左移 n 位就是乘以 2 的 n 次方。 其功能把 <<
左边的运算数的各二进位全部左移若干位,由 <<
右边的数指定移动的位数,高位丢弃,低位补 0。
右移运算符 >>
是双目运算符。右移 n 位就是除以 2 的 n 次方。 其功能是把 >>
左边的运算数的各二进位全部右移若干位, >>
右边的数指定移动的位数。