zoukankan      html  css  js  c++  java
  • 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
    ", 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 次方。 其功能是把 >> 左边的运算数的各二进位全部右移若干位, >> 右边的数指定移动的位数。

  • 相关阅读:
    1.1 Introduction中 Apache Kafka™ is a distributed streaming platform. What exactly does that mean?(官网剖析)(博主推荐)
    Android 涂鸦最佳实践
    使用 stvd 编译STM8S 时能看到使用RAM ROM大小的方法
    【四】注入框架RoboGuice使用:(Your First System Service Injection)
    让演示样例代码在手机上换行显示
    归并排序算法
    HDU 1573 X问题 中国剩余定理
    【leetcode】6. ZigZag Conversion
    sdfs
    翻转句子中单词的顺序 C语言
  • 原文地址:https://www.cnblogs.com/niuben/p/14788507.html
Copyright © 2011-2022 走看看