Go 语言常量(Constant)详解
                           
天天向上
发布: 2025-03-25 23:42:23

原创
754 人浏览过

在 Go 语言中,常量(Constant) 是指值在程序运行期间不会发生变化的变量。Go 语言使用 const 关键字来定义常量。


1. Go 语言常量的特点

  • 必须在编译时确定值,不能由运行时计算得出(例如,函数返回值不能用于常量赋值)。
  • 只能是基本数据类型boolstringintfloatcomplex 等)。
  • 不能使用 := 语法(Go 语言中 := 只能用于变量)。

2. 常量的声明

(1)基本语法

const 常量名 = 值

示例:

package main

import "fmt"

func main() {
    const pi = 3.14159
    const message = "Hello, Go!"

    fmt.Println(pi)       // 输出 3.14159
    fmt.Println(message)  // 输出 Hello, Go!
}

(2)显式类型常量

const a int = 100
const b float64 = 3.14
const c string = "GoLang"

(3)隐式类型常量

const x = 42
const y = "Hello"

在这种情况下,Go 自动推导常量类型


3. 多个常量的声明

(1)单行声明多个常量

const a, b, c = 1, "Go", 3.14
fmt.Println(a, b, c) // 输出 1 Go 3.14

(2)多行分组声明

const (
    name  = "Alice"
    age   = 25
    score = 99.5
)

这种方式提高了可读性,推荐使用


4. 常量的计算

常量可以用于编译期计算

const (
    a = 10
    b = 20
    c = a + b // 30
)
fmt.Println(c)

但是,常量不能由运行时计算得出

func getValue() int {
    return 100
}

const x = getValue()  // ❌ 报错,函数返回值不能用于常量

5. iota 常量生成器

iota 是 Go 语言的常量计数器默认从 0 开始,每定义一个常量 iota 递增 1

(1)基础用法

const (
    a = iota  // 0
    b = iota  // 1
    c = iota  // 2
)
fmt.Println(a, b, c) // 输出 0 1 2

(2)简写方式

const (
    a = iota  // 0
    b         // 1
    c         // 2
)
fmt.Println(a, b, c) // 输出 0 1 2

省略 iota,Go 语言会自动推导。

(3)iota 结合位运算

const (
    a = 1 << iota  // 1  (2^0)
    b              // 2  (2^1)
    c              // 4  (2^2)
    d              // 8  (2^3)
)
fmt.Println(a, b, c, d) // 输出 1 2 4 8

常见用于定义 二进制标志位(Bit Flags)

(4)iota 遇到中断

如果某行有值,iota 仍会递增:

const (
    a = iota  // 0
    b = 100   // 100(手动赋值)
    c = iota  // 2(恢复计数)
    d         // 3(继续计数)
)
fmt.Println(a, b, c, d) // 输出 0 100 2 3

(5)iota 实现枚举

type Weekday int

const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)
fmt.Println(Sunday, Monday, Saturday) // 输出 0 1 6

适用于定义枚举类型。


6. 常量与 var 的区别

特性常量(const)变量(var)
是否可修改❌ 不可修改✅ 可修改
是否必须初始化✅ 必须初始化❌ 可以不初始化
运行时计算❌ 不支持✅ 支持
作用域整个包(局部/全局)整个包(局部/全局)
:= 赋值❌ 不支持✅ 支持

7. 总结

关键点说明
常量定义使用 const 关键字
类型支持 intfloatstringbool
不可变性常量值一旦定义,不能修改
多常量声明可以使用 const (...) 进行分组
计算允许编译期计算,但不支持运行时计算
iota用于自动递增常量(从 0 开始)

发表回复 0

Your email address will not be published. Required fields are marked *