当前位置: 首页 > news >正文

【Go】P2 Golang 常量与变量

目录

  • 常量
    • 常量的基本规则
    • 常量定义的方法
      • 单个常量的声明
      • 常量组声明
      • 批量声明的简化形式
    • iota:强大的常量生成器
      • 基本用法
      • 高级技巧
  • 变量
    • 变量命名的基本规则
    • 变量定义的方法
      • 1. 标准变量定义
      • 2. 一次定义多个变量
      • 3. 短变量定义法
      • 4. 匿名变量
      • 5. 零值的合理利用
  • 小结:对比常量与变量

在这里插入图片描述

常量

常量的基本规则

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

const pi = 3.14159
const greeting = "Hi, Go!"
const enabled = true

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

package mainconst ExportedConst = "可导出的常量"   // 可导出
const privateConst = "私有常量"       // 不可导出const PackageConst = "包级常量"func main() {// 可以在包内任何地方使用fmt.Println(PackageConst)
}func example() {const localConst = "函数级常量"// 只能在函数内使用fmt.Println(localConst)
}

常量定义的方法

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

  • 有类型常量:

    const typedInt int = 66
    const typedFloat float64 = 3.14
    const typedString string = "ni"
    
  • 无类型常量:

const untypedInt = 66
const untypedFloat = 3.14
const untypedString = "hi"

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

单个常量的声明

const name = "张三"
const age = 45

常量组声明

const (StatusOK = 200StatusNotFound = 404StatusInternalError = 500
)

批量声明的简化形式

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

const (a = 1b			// b = 1c			// c = 1d = 2e			// e = 2
)

iota:强大的常量生成器

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

基本用法

const (Sunday = iota		// 0Monday				// 1Tuesday				// 2...
)

高级技巧

跳过某些值

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

复杂表达式

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

同一行使用多次 iota

const (a, b = iota + 1, iota + 2		// a=1, b=2c, d				// c=2, d=3e, f				// e=3, f=4
)

变量

变量命名的基本规则

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 关键字进行变量定义:

// 定义单个变量
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语言提供了多种方式来同时定义多个变量:

方法一:同类型批量定义

var name, address, email string
var x, y, z int

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

var (name    stringage     intheight  float64isValid bool
)

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

var name, age, height = "李四", 30, 180.0var (username = "admin"password = "123456"port     = 8080debug    = true
)

3. 短变量定义法

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

// 单个变量
name := "王五"
age := 28
height := 172.3// 多个变量
name, age, city := "赵六", 35, "北京"
x, y := 10, 20

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

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

4. 匿名变量

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

studentName, _, _ := getStudentInfo()  // 只需要姓名

5. 零值的合理利用

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

var a int        // 零值为0
var b string      // 零值为""
var c bool         // 零值为false
var d []int     // 零值为nil
...

小结:对比常量与变量

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

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

2025.09 长椿街


文章转载自:

http://pR6Ozog2.jxtbr.cn
http://pIs7DnM5.jxtbr.cn
http://nI34b0qf.jxtbr.cn
http://7VKa1eGB.jxtbr.cn
http://pivXbGgz.jxtbr.cn
http://vRxmAtLJ.jxtbr.cn
http://5ZYRzJI0.jxtbr.cn
http://49uf7Rf6.jxtbr.cn
http://fwSStxfl.jxtbr.cn
http://j3ggZMun.jxtbr.cn
http://BrINkAMH.jxtbr.cn
http://dNAWjw1S.jxtbr.cn
http://WEoCZ5hi.jxtbr.cn
http://QGujhOJO.jxtbr.cn
http://UvnZKJZh.jxtbr.cn
http://eUAvhODI.jxtbr.cn
http://Kz5FGu3H.jxtbr.cn
http://X4cR4doG.jxtbr.cn
http://f394pWLt.jxtbr.cn
http://57LzIp1q.jxtbr.cn
http://Xykp9kjB.jxtbr.cn
http://5iz8p860.jxtbr.cn
http://sN7fY45U.jxtbr.cn
http://DoqsTMLZ.jxtbr.cn
http://PkTKVQUB.jxtbr.cn
http://A0wU3u7f.jxtbr.cn
http://H7LNgHhx.jxtbr.cn
http://rbqB6sPe.jxtbr.cn
http://B6X4Typ3.jxtbr.cn
http://BP6yibrZ.jxtbr.cn
http://www.dtcms.com/a/368730.html

相关文章:

  • Leetcode—721. 账户合并【中等】
  • Go初级之十:错误处理与程序健壮性
  • Go语言的编译和运行过程
  • Golang语言设计理念
  • Golang Goroutine 与 Channel:构建高效并发程序的基石
  • Golang中的context包介绍及源码阅读
  • 【JMeter】分布式集群压测
  • GEO 搜索引擎优化系统源码搭建与定制开发,支持OEM
  • Linux学习-硬件(串口通信)
  • 【蓝桥杯选拔赛真题65】C++求个数 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解
  • AI美颜与瘦脸技术全解析
  • Dify on DMS,快速构建开箱即用的客服对话数据质检服务
  • 数字人打断对话的逻辑
  • Claude Code成本浪费严重?80%开支可省!Token黑洞解密与三层省钱攻略
  • 基于STM32的交通灯设计—紧急模式、可调时间
  • (未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
  • OpenResty 和 Nginx 到底有啥区别?你真的了解吗!
  • c++ 第三方库与个人封装库
  • 好看的背景颜色 uniapp+小程序
  • 多目标粒子群优化(MOPSO)MATLAB
  • 【MySQL】mysql C/C++ connect
  • 设置静态IP的方法
  • 用得更顺手的 Protobuf 文件后缀、流式多消息、大数据集与“自描述消息”实战
  • 机器学习入门,用Lima在macOS免费搭建Docker环境,彻底解决镜像与收费难题!
  • 从碎片化到一体化:Java分布式缓存的“三级跳”实战
  • 深入剖析RocketMQ分布式消息架构:从入门到精通的技术全景解析
  • 通过API接口管理企业微信通讯录案例
  • 飞算JavaAI炫技赛:电商系统开发全流程实战解析
  • MySQL集群——主从复制
  • 项目必备流程图,类图,E-R图实例速通