目 录CONTENT

文章目录

Go学习系列04-常量

cplinux98
2022-09-12 / 0 评论 / 0 点赞 / 710 阅读 / 1,315 字 / 正在检测是否收录...

什么是常量

存储不会变化的变量,这个就是常量

定义常量

使用关键字const定义,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。

所有常量的运算都可以在编译期完成,这样不仅可以减少运行时的工作,也方便其他代码的编译优化,当操作数是常量时,一些运行时的错误也可以在编译时被发现,例如整数除零、字符串索引越界、任何导致无效浮点数的操作等。

const 常量名 [类型] = 常量值

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

  • 显式类型定义: const b string = “abc”
  • 隐式类型定义: const b = “abc”

批量定义常量

const (
  e = 2.71
  pi = 3.14
)

除了第一个外其它的常量右边的初始化表达式都可以省略,如果省略初始化表达式则表示使用前面常量的初始化表达式,对应的常量类型也是一样的。

const ( 
    a = 1 
    b 
    c = 2 
    d 
) 

fmt.Println(a, b, c, d) // "1 1 2 2" 

常量运算

常量间的所有算术运算、逻辑运算和比较运算的结果也是常量,对常量的类型转换操作或以下函数调用都是返回常量结果:len、cap、real、imag、complex 和 unsafe.Sizeof。

因为它们的值是在编译期就确定的,因此常量可以是构成类型的一部分,例如用于指定数组类型的长度:

const IPv4Len = 4 

// parseIPv4 解析一个 IPv4 地址 (d.d.d.d). 
func parseIPv4(s string) IP { 
    var p [IPv4Len]byte 
    // ... 
} 

iota常量生成器

常量声明可以使用 iota 常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。在一个 const 声明语句中,在第一个声明的常量所在的行,iota 将会被置为 0,然后在每一个有常量声明的行加一。

type Weekday int 

const ( 
    Sunday Weekday = iota 
    Monday 
    Tuesday 
    Wednesday 
    Thursday 
    Friday 
    Saturday 
) 

每一行的iota都是相同的值,不管一行内出现多少次数

即使有一行不用iota,他也会自己增加

const内未赋值,与上一行保持一致

无类型常量

Go语言的常量有个不同寻常之处。虽然一个常量可以有任意一个确定的基础类型,例如 int 或 float64,或者是类似 time.Duration 这样的基础类型,但是许多常量并没有一个明确的基础类型。

编译器为这些没有明确的基础类型的数字常量提供比基础类型更高精度的算术运算,可以认为至少有 256bit 的运算精度。这里有六种未明确类型的常量类型,分别是无类型的布尔型、无类型的整数、无类型的字符、无类型的浮点数、无类型的复数、无类型的字符串。

通过延迟明确常量的具体类型,不仅可以提供更高的运算精度,而且可以直接用于更多的表达式而不需要显式的类型转换。

【示例 2】math.Pi 无类型的浮点数常量,可以直接用于任意需要浮点数或复数的地方:

var x float32 = math.Pi 
var y float64 = math.Pi 
var z complex128 = math.Pi 

如果 math.Pi 被确定为特定类型,比如 float64,那么结果精度可能会不一样,同时对于需要 float32 或 complex128 类型值的地方则需要一个明确的强制类型转换:

const Pi64 float64 = math.Pi 

var x float32 = float32(Pi64) 
var y float64 = Pi64 
var z complex128 = complex128(Pi64) 

对于常量面值,不同的写法可能会对应不同的类型。例如 0、0.0、0i 和 \u0000 虽然有着相同的常量值,但是它们分别对应无类型的整数、无类型的浮点数、无类型的复数和无类型的字符等不同的常量类型。同样,true 和 false 也是无类型的布尔类型,字符串面值常量是无类型的字符串类型。

字面常量

所谓字面常量(literal),是指程序中硬编码的常量。

iota举例

单位运算

const(
    _ = iota						// iota = 0
    KB = 1 << (10 * iota)			// iota = 1
    MB = 1 << (10 * iota)			// iota = 2
    GB = 1 << (10 * iota)			// iota = 3
    TB = 1 << (10 * iota)			// iota = 4
)

设置标记位

package main 

import "fmt" 

// 声明芯片类型 
type ChipType int 

const ( 
    None ChipType = iota 
    CPU    // 中央处理器 
    GPU    // 图形处理器 
) 

func (c ChipType) String() string { 
    switch c { 
    case None: 
        return "None" 
    case CPU: 
        return "CPU" 
    case GPU: 
        return "GPU" 
    } 

return "N/A" 
} 

func main() { 

// 输出CPU的值并以整型格式显示 
    fmt.Printf("%s %d", CPU, CPU) 
} 
0

评论区