Golang 入门 : 常量

常量

相对于变量而言,常量是在程序使用过程中,不会改变的数据。有些地方你需要将定义好的常量重复使用,代码中你不允许它的值改变。例如 圆周率 在程序执行过程中不会改变。

常量的声明

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\n", 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<<2l=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 次方。 其功能是把 >> 左边的运算数的各二进位全部右移若干位, >> 右边的数指定移动的位数。

posted @ 2021-05-20 09:19  牛奔  阅读(114)  评论(0编辑  收藏  举报