ZetCode

Golang const 关键字

最后修改于 2025 年 5 月 7 日

本教程将讲解如何在 Go 中使用 const 关键字。我们将通过实际示例介绍常量基础知识,包括声明和使用常量。

const 关键字用于声明在程序执行期间不能被修改的不可变值。常量提供编译时固定的值。

在 Go 中,const 可以声明数值、字符串、布尔值和其他基本类型。常量必须在声明时进行初始化,这有助于提高代码的可读性和可维护性。

基本常量声明

const 最简单的用法是声明单个不可变值。此示例展示了基本常量语法。

basic_const.go
package main

import "fmt"

func main() {
    const pi = 3.14159
    const appName = "MyGoApp"
    
    fmt.Println("Pi value:", pi)
    fmt.Println("Application:", appName)
    
    // pi = 3.14  // This would cause compile error
}

piappName 是不能被修改的常量。尝试更改它们会导致编译错误。

类型常量

常量可以拥有显式类型,以增强类型安全。此示例展示了类型常量声明。

typed_const.go
package main

import "fmt"

func main() {
    const maxUsers int = 100
    const defaultTimeout float64 = 30.5
    const welcomeMessage string = "Hello, Gopher!"
    
    fmt.Printf("Max users: %d (%T)\n", maxUsers, maxUsers)
    fmt.Printf("Timeout: %f (%T)\n", defaultTimeout, defaultTimeout)
    fmt.Printf("Message: %s (%T)\n", welcomeMessage, welcomeMessage)
}

每个常量都声明了显式类型。fmt.Printf 中的 %T 格式说明符会显示每个常量的数据类型。

多常量声明

Go 允许在一个块中声明多个常量。此示例展示了分组常量语法。

multiple_const.go
package main

import "fmt"

func main() {
    const (
        daysInWeek   = 7
        hoursInDay   = 24
        minutesInHour = 60
    )
    
    fmt.Printf("Week has %d days\n", daysInWeek)
    fmt.Printf("Day has %d hours\n", hoursInDay)
    fmt.Printf("Hour has %d minutes\n", minutesInHour)
}

常量被包含在括号内。这种语法对于相关的常量来说更简洁,并提供了更好的代码组织。

常量表达式

常量可以用在编译时求值的表达式来初始化。此示例演示了常量表达式。

const_expr.go
package main

import "fmt"

func main() {
    const (
        secondsInMinute = 60
        secondsInHour   = secondsInMinute * 60
        secondsInDay    = secondsInHour * 24
    )
    
    fmt.Printf("Minute: %d seconds\n", secondsInMinute)
    fmt.Printf("Hour: %d seconds\n", secondsInHour)
    fmt.Printf("Day: %d seconds\n", secondsInDay)
}

常量使用了算术表达式。这些表达式在编译时进行求值,而不是在运行时,因此效率很高。

Iota 用于枚举常量

Go 的 iota 标识符用于创建枚举常量。此示例展示了如何有效地使用 iota。

iota_const.go
package main

import "fmt"

func main() {
    const (
        Monday = iota + 1
        Tuesday
        Wednesday
        Thursday
        Friday
        Saturday
        Sunday
    )
    
    fmt.Println("Days:", Monday, Tuesday, Wednesday, 
        Thursday, Friday, Saturday, Sunday)
    
    const (
        Read = 1 << iota
        Write
        Execute
    )
    
    fmt.Printf("Permissions: Read=%b, Write=%b, Execute=%b\n", 
        Read, Write, Execute)
}

iota 从 0 开始,每个常量递增 1。第二组示例使用位移运算演示了位掩码模式的创建。

字符串常量

字符串常量在 Go 程序中很常见。此示例展示了它们的声明和用法。

string_const.go
package main

import "fmt"

const (
    greeting     = "Hello, World!"
    farewell     = "Goodbye for now!"
    errorMessage = "An error occurred"
)

func main() {
    fmt.Println(greeting)
    fmt.Println(farewell)
    fmt.Println(errorMessage)
    
    const multiline = `This is a
multiline string
constant in Go`
    
    fmt.Println(multiline)
}

字符串常量可以是单行或多行(使用反引号)。它们常用于消息、模板和配置值。

实际示例:配置常量

这个实际示例展示了常量如何组织配置值。常量有助于在整个应用程序中保持一致性。

config_const.go
package main

import "fmt"

const (
    AppName    = "InventoryManager"
    AppVersion = "1.2.3"
    
    MaxConnections = 100
    TimeoutSeconds = 30
    
    AdminEmail = "admin@example.com"
    SupportURL = "https://support.example.com"
)

func main() {
    fmt.Printf("%s v%s\n", AppName, AppVersion)
    fmt.Println("Settings:")
    fmt.Printf("Max connections: %d\n", MaxConnections)
    fmt.Printf("Timeout: %d seconds\n", TimeoutSeconds)
    fmt.Printf("Contact: %s\n", AdminEmail)
    fmt.Printf("Support: %s\n", SupportURL)
}

应用程序配置集中在常量中。这使得维护更加容易,并防止代码中出现“魔法值”。

来源

Go 语言规范

本教程通过各种场景下声明和使用常量的实际示例,讲解了 Go 中的 const 关键字。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Golang 教程