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

Go语言教程-变量、常量、命名规则

命名规则

Go语言的命名规则遵循以下规范:

  1. 字母或下划线开头:名称必须以字母或下划线开头

  2. 后续字符:可以是字母、数字或下划线

  3. 区分大小写Namename是不同的标识符

  4. 关键字不能作为标识符:如funcvarpackage

  5. 推荐使用驼峰命名法

    • 导出名称(首字母大写):UserName

    • 非导出名称(首字母小写):userName

变量

变量声明

// 单变量声明
var name string = "John"// 类型推断
var age = 30// 多变量声明
var width, height int = 100, 50// 简短声明(只能在函数内使用)
count := 10

变量默认值

  • 数值类型:0

  • 布尔类型:false

  • 字符串:""(空字符串)

  • 指针、函数、接口、slice、channel、map:nil

全局变量

全局变量是在函数外部声明的变量,可以在整个包内访问(如果首字母大写,则可以在其他包中访问)。

全局变量特点

  1. 声明在函数体外部

  2. 生命周期贯穿整个程序运行期间

  3. 如果首字母大写,可以被其他包访问

  4. 如果首字母小写,只能在当前包内访问

全局变量示例

package main  // 必须声明包名(main包才能直接运行)import "fmt"  // 需要导入fmt包才能使用Printlnvar global = "我是全局的" // 全局变量func main() {fmt.Println(global) // 可以访问
}

局部变量

局部变量是在函数或代码块内部声明的变量,只在声明它们的函数或代码块内有效。

局部变量特点

  1. 声明在函数或代码块内部

  2. 生命周期仅限于函数或代码块执行期间

  3. 只能在声明它们的函数或代码块内访问

  4. 可以使用简短声明语法 :=

局部变量示例

package mainimport "fmt"func main() {local := "我是局部的"fmt.Println(local)  // 输出
}

全局变量与局部变量的优先级

当全局变量和局部变量同名时,局部变量会优先被使用:

package mainimport "fmt"// 全局变量 - 在整个包中都可以访问
var globalVar = "我是全局变量"func printVars() {// 局部变量 - 只在这个函数内有效localVar := "我是printVars的局部变量"fmt.Println("(4) 在printVars函数内 - 局部变量:", localVar)fmt.Println("(5) 在printVars函数内 - 全局变量:", globalVar) // 可以访问全局变量// 修改全局变量globalVar = "在printVars中修改后的全局变量"fmt.Println("(6) 在printVars函数内 - 修改后的全局变量:", globalVar)
}func main() {fmt.Println("(1) main函数开始 - 全局变量:", globalVar)// 局部变量 - 只在main函数内有效localVar := "我是main的局部变量"fmt.Println("(2) main函数内 - 局部变量:", localVar)fmt.Println("(3) main函数内 - 全局变量:", globalVar)printVars() // 调用printVars函数fmt.Println("(7) 回到main函数 - 局部变量:", localVar)fmt.Println("(8) 回到main函数 - 全局变量:", globalVar) // 全局变量已被修改// 代码块内的局部变量{blockVar := "我是代码块内的局部变量"fmt.Println("(9) 代码块内 - 块变量:", blockVar)// fmt.Println(localVar) // 可以访问外层局部变量}// fmt.Println(blockVar) // 错误!blockVar在这里不可访问fmt.Println("(10) 程序结束")
}

常量

常量声明

常量是Go语言中一种固定不变的值,在程序运行期间不能被修改。本教程将详细介绍Go语言中常量的定义、使用和相关特性。

演示代码:

/** Go语言常量使用完整示例(修正大整数问题版)* 包含各种常量定义方式和使用场景*/package mainimport ("fmt""math""math/big"
)// 1. 基本常量定义
const Pi = 3.14159                   // 无类型浮点常量
const AppName = "MyGoApp"            // 无类型字符串常量
const MaxRetry = 3                   // 无类型整型常量// 2. 多常量声明(常量组)
const (StatusOK      = 200   // HTTP状态码200StatusCreated = 201   // HTTP状态码201StatusError   = 500   // HTTP状态码500
)// 3. 显式类型常量
const MaxUsers int = 1000             // 显式声明为int类型
const Greeting string = "Hello, 世界!" // 显式声明为string类型
const Price float64 = 99.99           // 显式声明为float64类型// 4. 常量表达式
const (SecondsPerMinute = 60SecondsPerHour   = SecondsPerMinute * 60  // 基于其他常量计算SecondsPerDay    = SecondsPerHour * 24
)// 5. iota枚举示例(星期)
const (Sunday = iota // 0,从0开始Monday        // 1Tuesday       // 2Wednesday     // 3Thursday      // 4Friday        // 5Saturday      // 6
)// 6. iota位运算示例(文件大小)
const (_  = iota             // 忽略第一个值(0)KB = 1 << (10 * iota) // 1 << 10 = 1024MB                    // 1 << 20 = 1048576GB                    // 1 << 30 = 1073741824
)// 7. 大整数常量处理(修正版)
const (// 注意:9876543210123456789超过了int64的最大值9223372036854775807// 解决方案1:使用uint64(如果确定是非负数)BigNumber uint64 = 9223372036854775807 // 使用int64最大值// 解决方案2:使用字符串表示更大的数字HugeNumberStr = "9876543210123456789"// 解决方案3:使用较小的数字SmallNumber = 987654321
)func main() {// ========== 基本常量使用 ==========fmt.Println("=== 基本常量 ===")fmt.Printf("Pi = %.5f\n", Pi)fmt.Printf("Application: %s\n", AppName)fmt.Printf("Max retry times: %d\n", MaxRetry)// ========== 类型化常量使用 ==========fmt.Println("\n=== 类型化常量 ===")fmt.Printf("Max users: %d (type: %T)\n", MaxUsers, MaxUsers)fmt.Printf("Greeting: %s (type: %T)\n", Greeting, Greeting)fmt.Printf("Price: %.2f (type: %T)\n", Price, Price)// ========== 常量表达式使用 ==========fmt.Println("\n=== 常量表达式 ===")fmt.Printf("Seconds in a day: %d\n", SecondsPerDay)// ========== iota枚举使用 ==========fmt.Println("\n=== iota枚举 ===")fmt.Printf("Wednesday is day %d of the week\n", Wednesday)// ========== 文件大小常量 ==========fmt.Println("\n=== 文件大小常量 ===")fmt.Printf("1GB = %d bytes\n", GB)// ========== 大整数处理 ==========fmt.Println("\n=== 大整数处理 ===")// 使用uint64打印大整数fmt.Printf("Big number (uint64): %d\n", BigNumber)// 使用math/big处理超大整数bigInt := new(big.Int)bigInt.SetString(HugeNumberStr, 10)fmt.Printf("Huge number: %s\n", bigInt.String())// 打印较小的数字fmt.Printf("Small number: %d\n", SmallNumber)// ========== 常量运算 ==========fmt.Println("\n=== 常量运算 ===")const radius = 5.0area := Pi * math.Pow(radius, 2)fmt.Printf("Area of circle with radius %.1f: %.2f\n", radius, area)// ========== 类型转换 ==========const temperature = 100 // 无类型整数常量fTemp := float64(temperature)*1.8 + 32fmt.Printf("%d°C is %.1f°F\n", temperature, fTemp)// ========== 常量与变量比较 ==========fmt.Println("\n=== 常量与变量比较 ===")var userCount = 850if userCount < MaxUsers {fmt.Printf("User count (%d) is below maximum (%d)\n", userCount, MaxUsers)} else {fmt.Printf("User count (%d) has reached maximum (%d)\n", userCount, MaxUsers)}// ========== 常量类型推断 ==========fmt.Println("\n=== 常量类型推断 ===")const inferredInt = 123const inferredFloat = 123.456const inferredComplex = 1 + 2ifmt.Printf("inferredInt: %d (type: %T)\n", inferredInt, inferredInt)fmt.Printf("inferredFloat: %f (type: %T)\n", inferredFloat, inferredFloat)fmt.Printf("inferredComplex: %v (type: %T)\n", inferredComplex, inferredComplex)
}

 输出结果:

=== 基本常量 ===
Pi = 3.14159
Application: MyGoApp
Max retry times: 3=== 类型化常量 ===
Max users: 1000 (type: int)
Greeting: Hello, 世界! (type: string)
Price: 99.99 (type: float64)=== 常量表达式 ===
Seconds in a day: 86400=== iota枚举 ===
Wednesday is day 3 of the week=== 文件大小常量 ===
1GB = 1073741824 bytes=== 大整数处理 ===
Big number (uint64): 9223372036854775807
Huge number: 9876543210123456789
Small number: 987654321=== 常量运算 ===
Area of circle with radius 5.0: 78.54
100°C is 212.0°F=== 常量与变量比较 ===
User count (850) is below maximum (1000)=== 常量类型推断 ===
inferredInt: 123 (type: int)
inferredFloat: 123.456000 (type: float64)
inferredComplex: (1+2i) (type: complex128)

常量与变量区别

  1. 常量必须在编译时确定值,变量可以在运行时确定

  2. 常量不能修改,变量可以

  3. 常量可以是无类型的

常量使用场景

  1. 配置值(如端口号、超时时间)

  2. 枚举值

  3. 数学常数

  4. 程序中固定不变的值

注意事项

  1. 常量不能使用:=语法声明

  2. 常量所有算术、逻辑和比较运算结果也是常量

  3. 常量不能使用函数调用初始化(除了内置函数如len

http://www.dtcms.com/a/272320.html

相关文章:

  • 亚矩阵云手机破解Maio广告平台多账号风控:从“生存焦虑”到“规模化增长”的终极方案
  • 电路研究9.4——合宙Air780EP的LuatOS、CSDK跟标准AT
  • 基于开源AI大模型AI智能名片S2B2C商城小程序源码的私域流量新生态构建
  • 独立服务器选择Rocky Linux还是CentOS
  • 【数据结构】顺序表(sequential list)
  • 学习中断配置的一天(第五天)
  • 安装nginx+php环境
  • OpenCV探索之旅:多尺度视觉与形状的灵魂--图像金字塔与轮廓分析
  • 无人机识别比赛记录与分析
  • Java---IDEA
  • 【论文阅读】Decoupled Knowledge Distillation
  • 【大模型推理论文阅读】 Thinking Tokens are Information Peaks in LLM Reasoning
  • iOS 抓包详细教程:从零搭建、操作到实战调试的全流程指南
  • 图像亮度调整的简单实现
  • Flutter多线程机制深度解析
  • 【Docker基础】Docker容器与网络关联命令使用指南:深入理解容器网络连接
  • 力扣61.旋转链表
  • Windows下VScode配置FFmpeg开发环境保姆级教程
  • 面试150 LRU缓存
  • LeetCode - 1668. 最大重复子字符串
  • 原创:多面体编译,polybench-c-4.2批量测试脚本
  • php中array($this, ‘loadClass‘)表示啥意思?
  • 阿里云-跨账号同步OSS Bucket
  • 【Note】Linux Kernel 之 内核架构、源码文件、API/ABI 、FHS
  • Linux 内核日志中常见错误
  • idea安装maven 拉取依赖失败的解决办法
  • 网络基本概念
  • Ubuntu22.0.4安装PaddleNLP
  • Android Coil 3 data加载图的Bitmap或ByteArray数据类型,Kotlin
  • Redis BigKey 深度解析:从原理到实战解决方案