• [go学习笔记.第十五章.反射,常量] 2.常量


    1.常量的定格式 

     const identifier [type] = value

    可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。

            显式类型定义: const b string = "abc"
            隐式类型定义: const b = "abc"
            多个相同类型的声明可以简写为:  const c_name1, c_name2 = value1, value2

    注意:

    • 数据类型可以省略, 但是const不能省略
    • 定义常量不能使用 := , := 是专门用于定义局部变量的
    • 定义局部变量没有使用, 编译会报错, 定义全局变量和常量没有使用, 不会报错
    • 在Go语言中可以连续定义多个变量, 所以也可以连续定义多个常量
      格式:
      const 变量名称1, 变量名称2 数据类型 = 值1, 值2
      const(
      变量名称1 数据类型 = 值1
      变量名称2 数据类型 = 值2
      )

    2.举例说明:

    定义单个常量 

    1. const num int = 666 //方式一
    2. //const num = 666 //方式二
    3. //const num := 666 报错,:=只能用于定义局部变量
    4. fmt.Printf("%d\n", num)

    定义多个常量 

    1. const a, b, c int = 10, 20, 30 //方式一
    2. //const a, b, c = 10, 20, 30 //方式二
    3. //常量不是变量,只能定义的同时初始化,之后不能赋值,后面三行代码会报错
    4. //a = 666
    5. //b = 777
    6. //c = 888

    常量组

    1. //方式一
    2. const(
    3. a int = 10
    4. b int = 20
    5. c int = 30
    6. )
    7. //方式二
    8. //const(
    9. // a = 10
    10. // b = 20
    11. // c = 30
    12. //)
    13. //下三行会报错
    14. //a = 666
    15. //b = 777
    16. //c = 888

     常量组的注意点

    • 和变量不同,定义的常量没有被使用,编译器不会报错, 可以编译运行
    • 在常量组中, 如果常量没有赋值, 那么默认值就是上一行的取值,注意,是一行
    1. const(
    2. a = 666 //666
    3. b = 789 //789
    4. c //789
    5. )
    6. fmt.Printf("%d, %d, %d", a, b, c)
    7. const(
    8. a, b = 10, 20
    9. c, d //c,d对应a,b的值
    10. )
    11. fmt.Printf("%d, %d\n", a, b) //10,20
    12. fmt.Printf("%d, %d\n", c, d) //10,20

    3.枚举常量 

    • Go语句中没有明确枚举的固定写法, 但是在企业开发中一般都会常量组的形式来表示枚举
    • 格式:
      const(
            枚举元素 = 值
            枚举元素 = 值
      )
      1. const(
      2. male = 0
      3. female = 1
      4. )

    迭代器iota-特殊常量,可以认为是一个可以被编译器修改的常量

    1. //iota是迭代器, 默认会从0开始递增
    2. const(
    3. male = iota //0
    4. female = iota //1
    5. yao = iota //2
    6. )

    只要常量组中出现了iota, 该常量组中后续的常量都会一次递增1 

    1. const(
    2. male = iota //0
    3. female //1
    4. yao //2
    5. )

    如果常量组中的iota被打断了, 那么就不会继续递增了, 会按照常量组的默认方式处理(上一行的值) 

    1. const(
    2. male = iota //0
    3. female = 666 //666
    4. yao //666
    5. )

    如果常量组中的itoa被打断了, 但是后续又被恢复了(显式恢复), 那么前面有多少行就会递增多少 

    1. const(
    2. male = iota //0
    3. female = 666 //666
    4. yao = iota //2
    5. )
    1. package main
    2. import "fmt"
    3. func main() {
    4. const (
    5. a = iota //0
    6. b //1
    7. c //2
    8. d = "ha" //独立值,iota += 1
    9. e //"ha" iota += 1
    10. f = 100 //iota +=1
    11. g //100 iota +=1
    12. h = iota //7,恢复计数
    13. i //8
    14. )
    15. fmt.Println(a,b,c,d,e,f,g,h,i)
    16. }
    17. //结果如下:
    18. //0 1 2 ha ha 100 100 7 8
    1. package main
    2. import "fmt"
    3. const (
    4. i=1<<iota
    5. j=3<<iota
    6. k
    7. l
    8. )
    9. func main() {
    10. fmt.Println("i=",i)
    11. fmt.Println("j=",j)
    12. fmt.Println("k=",k)
    13. fmt.Println("l=",l)
    14. }
    15. //结果如下:
    16. //i= 1
    17. //j= 6
    18. //k= 12
    19. //l= 24
    20. //iota 表示从 0 开始自动加 1,所以 i=1<<0, j=3<<1(<< 表示左移的意思),即:i=1, j=6,这没问题,关键在 k 和 l,从输出结果看 k=3<<2,l=3<<3。
    21. //简单表述:
    22. //i=1:左移 0 位,不变仍为 1; j=3:左移 1 位,变为二进制 110, 即 6; k=3:左移 2 位,变为二进制 1100, 即 12; l=3:左移 3 位,变为二进制 11000,即 24

    常量可以用len(), cap(), unsafe.Sizeof()函数计算表达式的值。常量表达式中,函数必须是内置函数,否则编译不过 

    1. package main
    2. import "unsafe"
    3. const (
    4. a = "abc"
    5. b = len(a)
    6. c = unsafe.Sizeof(a)
    7. )
    8. func main(){
    9. println(a, b, c)
    10. }
    11. //结果如下:
    12. //abc 3 16
    13. //unsafe.Sizeof(a): 字符串类型在 go 里是个结构, 包含指向底层数组的指针和长度,这两部分每部分都是8个字节,所以字符串类型大小为 16 个字节

    4.案例

    案例1

    1. package main
    2. import (
    3. "fmt"
    4. )
    5. func main() {
    6. var num int
    7. //1.常量声明的时候,必须赋值
    8. const tax int = 0
    9. fmt.Println(num, tax)
    10. //2.常量不能修改
    11. // tax = 10
    12. //3.常量只能去修饰bool,数值类型(int,float系列),string类型
    13. const (
    14. a = iota
    15. b
    16. c
    17. )
    18. fmt.Println(a, b, c)
    19. }

    案例2

    1. package main
    2. import "fmt"
    3. func main() {
    4. const LENGTH int = 10
    5. const WIDTH int = 5
    6. var area int
    7. const a, b, c = 1, false, "str" //多重赋值
    8. area = LENGTH * WIDTH
    9. fmt.Printf("面积为 : %d", area)
    10. println()
    11. println(a, b, c)
    12. }
    13. //结果如下:
    14. //面积为 : 50
    15. //1 false str

    [上一节][go学习笔记.第十五章.反射] 1.反射的基本介绍以及实践

    [下一节][go学习笔记.第十六章.TCP编程] 1.基本介绍以及入门案例 

  • 相关阅读:
    DBMS 中的 2 层架构与 3 层架构
    ChatGPT-4 VS 文心一言4.0
    服务器端文档组件
    【统计分析和过程改进】上海道宁带来Minitab软件合集,帮助企业和组织发挥数据的价值
    数据链路层——MAC帧、ARP协议详解
    使用Github Actions自动同步到Gitee仓库
    Java 21 正式 GA,虚拟线程真的来了
    对比学习系列论文COST(二):
    TypeScript笔记:接口
    electron实现静默打印(各种踩坑解决)
  • 原文地址:https://blog.csdn.net/zhoupenghui168/article/details/127877899