【Go】P2 Golang 常量与变量

目录

常量

常量的基本规则

常量,是编译时 就已确定的值,一旦定义就无法再修改。常量使用 const 关键字声明:

go 复制代码
const pi = 3.14159
const greeting = "Hi, Go!"
const enabled = true

对于包级常量与函数级常量,其作用范围不同、写法亦不同。此外,以大写字母开头的常量可以被其他包导入:

go 复制代码
package main

const ExportedConst = "可导出的常量"   // 可导出
const privateConst = "私有常量"       // 不可导出

const PackageConst = "包级常量"

func main() {
    // 可以在包内任何地方使用
    fmt.Println(PackageConst)
}

func example() {
    const localConst = "函数级常量"
    // 只能在函数内使用
    fmt.Println(localConst)
}

常量定义的方法

常量的定义,支持有类型常量(Typed Constants)与无类型常量(Untyped Constants):

  • 有类型常量:

    go 复制代码
    const typedInt int = 66
    const typedFloat float64 = 3.14
    const typedString string = "ni"
  • 无类型常量:

go 复制代码
const untypedInt = 66
const untypedFloat = 3.14
const untypedString = "hi"

对于无类型常量,在使用时会根据上下文自动推断类型。

单个常量的声明

go 复制代码
const name = "张三"
const age = 45

常量组声明

go 复制代码
const (
	StatusOK = 200
	StatusNotFound = 404
	StatusInternalError = 500
)

批量声明的简化形式

在常量组中,如果不指定值,会复用上一个常量的表达式:

go 复制代码
const (
	a = 1
	b			// b = 1
	c			// c = 1
	d = 2
	e			// e = 2
)

iota:强大的常量生成器

iota 是 Go 语言的内置标识符,用于在常量声明中生成连续的整数值。在一个 const 分组中,iota 从 0 开始,每遇到一个常量声明,它的值就自动加 1。

基本用法

go 复制代码
const (
	Sunday = iota		// 0
	Monday				// 1
	Tuesday				// 2
	...
)

高级技巧

跳过某些值

go 复制代码
const (
	_ = iota		// 跳过 0
	KB = 1 << (10 * iota)		// 1 << 10 = 10000000000 (二进制) = 1024 (十进制)。
	MB				// MB = 1 << (10 * 2)
	...
)

复杂表达式

go 复制代码
const (
	bit0 = 1 << iota		// 1 << 0
	bit1				// 1 << 1 = 2 (十进制)
	bit2				// 1 << 2 = 4(十进制)
)

同一行使用多次 iota

go 复制代码
const (
	a, b = iota + 1, iota + 2		// a=1, b=2
	c, d				// c=2, d=3
	e, f				// e=3, f=4
)

变量

变量命名的基本规则

Go语言变量命名遵循以下基本规则:

  • 只能包含字母、数字和下划线
  • 必须以字母或下划线开头,不能以数字开头
  • 区分大小写
  • 不能使用Go语言的关键字
  • 建议使用驼峰命名法
go 复制代码
// 正确的变量名
var userName string
var age int
var _temp float64
var isValid bool
var userID int

// 错误的变量名
var 123name string    // 不能以数字开头
var user-name string  // 不能包含连字符
var for string        // 不能使用关键字

变量定义的方法

1. 标准变量定义

使用 var 关键字进行变量定义:

go 复制代码
// 定义单个变量
var name string
var age int
var height float64

// 定义时初始化
var name string = "张三"
var age int = 25
var height float64 = 175.5

// 类型推断
var name = "张三"        // 自动推断为string类型
var age = 25            // 自动推断为int类型
var height = 175.5      // 自动推断为float64类型

2. 一次定义多个变量

Go语言提供了多种方式来同时定义多个变量:

方法一:同类型批量定义

go 复制代码
var name, address, email string
var x, y, z int

方法二:不同类型批量定义

go 复制代码
var (
    name    string
    age     int
    height  float64
    isValid bool
)

方法三:批量定义并初始化

go 复制代码
var name, age, height = "李四", 30, 180.0

var (
    username = "admin"
    password = "123456"
    port     = 8080
    debug    = true
)

3. 短变量定义法

短变量定义法使用 := 操作符,是Go语言特有的简洁语法:

go 复制代码
// 单个变量
name := "王五"
age := 28
height := 172.3

// 多个变量
name, age, city := "赵六", 35, "北京"
x, y := 10, 20

注意事项

短变量定义法有一些重要的使用限制:

  1. 只能在函数内部使用,不能用于包级别变量定义
  2. 可以重新赋值已存在的变量,但至少要有一个新变量
go 复制代码
func main() {
    // 正确:定义新变量
    name := "测试"
    
    // 正确:重新赋值现有变量,同时定义新变量
    name, age := "新名字", 25
    
    // 错误:所有变量都已存在
    // name, age := "另一个名字", 30  // 编译错误
    
    // 正确:普通赋值
    name, age = "另一个名字", 30
}

4. 匿名变量

通过匿名变量,可以明确表达出只需要的部分返回值。

go 复制代码
studentName, _, _ := getStudentInfo()  // 只需要姓名

5. 零值的合理利用

Go 语言中不同的变量类型都存在有零值:

go 复制代码
var a int        // 零值为0
var b string      // 零值为""
var c bool         // 零值为false
var d []int     // 零值为nil
...

小结:对比常量与变量

特性 常量 变量
可变性 不可修改 可修改
内存分配 编译时替换 运行时分配
初始化时机 编译时 运行时
作用域 编译时作用域 运行时作用域

掌握常量与变量是 Go 语言代码编写的基础。

2025.09 长椿街

相关推荐
方安乐1 天前
python之向量、向量和、向量点积
开发语言·python·numpy
会编程的土豆1 天前
洛谷题单入门1 顺序结构
数据结构·算法·golang
小小小米粒1 天前
Collection单列集合、Map(Key - Value)双列集合,多继承实现。
java·开发语言·windows
前端一小卒1 天前
我用 Claude Code 的 Superpowers 技能链写了个服务,部署前差点把服务器搞炸
前端·javascript·后端
czhc11400756631 天前
C# 428 线程、异步
开发语言·c#
:1211 天前
java基础
java·开发语言
SilentSamsara1 天前
Python 环境搭建完整指南:从下载安装到运行第一个程序
开发语言·python
曹牧1 天前
Spring:@RequestMapping注解,匹配的顺序与上下文无关
java·后端·spring
小短腿的代码世界1 天前
Qt文件系统与IO深度解析:从QFile到异步文件操作
开发语言·qt
harder3211 天前
RMP模式的创新突破
开发语言·学习·ios·swift·策略模式