第八回:Go 语言常量

情比金坚永不变(常量与枚举)
唐伯虎
唐伯虎: 9527,有些东西是不能变的,比如我对秋香的爱,比如圆周率,比如华府的家规。这些在代码里,我们叫它常量 (Constant)。一旦定义,天王老子来了也不能改!

💎 传家宝 (常量定义)

使用 const 关键字定义。常量的值必须在编译时就能确定(比如数字、字符串、布尔值)。

const Pi = 3.14159
const Love = "秋香"
const IsHandsome = true
9527
9527: 如果我非要改呢?比如 Love = "石榴姐"
华夫人
华夫人: 大胆!如果你敢修改常量,编译器会直接报错,程序根本跑不起来!这就叫编译时错误

🔢 自动计数器 (iota)

Go 语言虽然没有 enum (枚举) 关键字,但它有更强大的神器 —— iota。它可以帮我们自动生成连续的数字,非常适合定义家丁等级。

const (
    LevelLow  = iota // 0 (低级家丁)
    LevelMid         // 1 (中级家丁)
    LevelHigh        // 2 (高级家丁)
    LevelTang        // 3 (书童华安)
)

唐伯虎解说: iota 就像是一个计数器,在 const 括号里,每增加一行,它就自动加 1。哪怕你不写赋值,它也会默认继承上一行的逻辑。

进阶用法:跳过与插队

const (
    A = iota // 0
    _        // 1 (跳过)
    C        // 2
    D = "插队" // D是字符串"插队", iota内部还在计数(3)
    E = iota // 4 (恢复计数)
)

🎭 变色龙 (无类型常量)

Go 的常量还有一个神奇的特性:无类型 (Untyped)

当你写 const a = 100 时,a 既可以当 int 用,也可以当 float64 用,因为它还没“定型”。

const money = 100

var i int = money     // 没问题
var f float64 = money // 也没问题!自动变成 100.0

🎯 练功房(坚如磐石)

任务: 使用 iota 定义文件大小单位:KB, MB, GB。

提示:1 << 10 表示 2 的 10 次方 (1024)。

package main
import "fmt"

const (
    _  = iota             // 0 (忽略)
    KB = 1 << (10 * iota) // 1 << 10 = 1024
    MB                    // ?
    GB                    // ?
)

func main() {
    fmt.Println("KB =", KB)
    fmt.Println("MB =", MB)
    fmt.Println("GB =", GB)
}

问题: MB 的值是多少?

答案: MB = 1048576 (1024 * 1024)

解析:

  • 第一行 iota=0
  • 第二行 iota=1KB = 1 << 10
  • 第三行 iota=2MB 继承公式 1 << (10 * 2)1 << 20
  • 第四行 iota=3GB = 1 << 30

这就是 iota 的强大之处!