第3章 - 变量与常量
嘿,朋友们!
变量是编程的基础,Go的变量声明方式可能和你之前学的语言有点不同,但非常简洁!我一开始用Go时,就爱上了:=这个简洁的语法——省去了好多冗余的代码!这对我这种自学的人来说,真是太友好了。
📝 变量声明
Go有三种声明变量的方式:
1. var 关键字(完整写法)
var name string = "张三"
var age int = 18
var isStudent bool = true
类型在变量名后面!(和Java/C相反)
2. 类型推断
var name = "张三" // 自动推断为 string
var age = 18 // 自动推断为 int
var price = 9.99 // 自动推断为 float64
对比TypeScript
// TypeScript
let name = "张三"; // 推断为 string
// Go
var name = "张三" // 推断为 string
很像吧!但Go是编译时确定,更安全。
3. 短变量声明 :=(最常用!)
name := "张三"
age := 18
isStudent := true
:= 是声明+赋值的简写,只能在函数内部使用。
注意
:= 是声明新变量,= 是给已有变量赋值:
name := "张三" // 声明并赋值
name = "李四" // 重新赋值(不需要:=)
name := "王五" // ❌ 错误!name已经声明过了
🎯 对比:Go vs Java vs JavaScript
// Java
String name = "张三";
int age = 18;
final double PI = 3.14;
// JavaScript
let name = "张三";
let age = 18;
const PI = 3.14;
// Go
name := "张三"
age := 18
const PI = 3.14
📦 多变量声明
// 方式1:同一行声明多个
var a, b, c int = 1, 2, 3
// 方式2:短变量声明
x, y, z := 1, "hello", true
// 方式3:批量声明(推荐用于包级别变量)
var (
name = "张三"
age = 18
height = 175.5
)
0️⃣ 零值(Zero Value)
Go的变量声明后如果不赋值,会有默认零值:
var i int // 0
var f float64 // 0.0
var s string // ""(空字符串)
var b bool // false
var p *int // nil(空指针)
对比Java
Java的基本类型也有默认值,但引用类型默认是null。 Go没有null,用nil表示"无",而且只有指针、slice、map等可以是nil。
🔒 常量 const
常量使用 const 关键字,值在编译时确定:
const PI = 3.14159
const AppName = "MyApp"
const MaxSize = 100
// 批量声明
const (
StatusOK = 200
StatusError = 500
)
iota - 常量生成器
iota 是Go的常量计数器,超级好用:
const (
Sunday = iota // 0
Monday // 1
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)
实用技巧:
// 从1开始
const (
January = iota + 1 // 1
February // 2
March // 3
)
// 跳过某个值
const (
A = iota // 0
_ // 1(跳过)
B // 2
C // 3
)
// 位运算(定义权限)
const (
Read = 1 << iota // 1 (001)
Write // 2 (010)
Execute // 4 (100)
)
// 组合权限:ReadWrite := Read | Write // 3 (011)
🌐 变量作用域
package main
var globalVar = "我是全局变量" // 包级别变量
func main() {
localVar := "我是局部变量"
if true {
blockVar := "我是块级变量"
fmt.Println(blockVar) // ✅ 可以访问
}
// fmt.Println(blockVar) // ❌ 错误,超出作用域
fmt.Println(globalVar) // ✅ 可以访问
fmt.Println(localVar) // ✅ 可以访问
}
可见性规则
Go用首字母大小写控制可见性:
- 首字母大写 → 公开(其他包可访问)
- 首字母小写 → 私有(仅当前包可访问)
var Name = "公开变量" // 其他包可以访问
var age = 18 // 仅当前包可以访问
这比Java的public/private简洁多了!
未使用的变量
Go不允许声明变量后不使用:
func main() {
name := "张三" // ❌ 编译错误:name declared but not used
}
这是Go的设计哲学:保持代码整洁,不要有无用代码。
如果临时不用,可以用空白标识符 _:
func main() {
name, _ := getInfo() // 忽略第二个返回值
fmt.Println(name)
}
实战案例:用户信息管理
package main
import "fmt"
// 包级别常量
const (
RoleAdmin = iota + 1 // 1
RoleEditor // 2
RoleViewer // 3
)
// 包级别变量
var appName = "用户管理系统"
func main() {
// 用户信息
userName := "张三"
userAge := 25
userRole := RoleAdmin
isActive := true
// 打印信息
fmt.Printf("=== %s ===\n", appName)
fmt.Printf("姓名: %s\n", userName)
fmt.Printf("年龄: %d\n", userAge)
fmt.Printf("角色ID: %d\n", userRole)
fmt.Printf("是否活跃: %t\n", isActive)
// 修改变量
userAge = 26
isActive = false
fmt.Printf("\n一年后,%s的年龄变成了%d\n", userName, userAge)
}
运行结果:
=== 用户管理系统 ===
姓名: 张三
年龄: 25
角色ID: 1
是否活跃: true
一年后,张三的年龄变成了26
练习
- 声明一个常量
MaxRetry值为 3 - 使用
iota定义四季:春(1)、夏(2)、秋(3)、冬(4) - 声明变量存储一个商品信息(名称、价格、库存、是否上架)
参考答案
package main
import "fmt"
// 1. 最大重试次数
const MaxRetry = 3
// 2. 四季
const (
Spring = iota + 1 // 1
Summer // 2
Autumn // 3
Winter // 4
)
func main() {
// 3. 商品信息
productName := "iPhone 15"
price := 6999.00
stock := 100
isOnSale := true
fmt.Printf("商品: %s\n", productName)
fmt.Printf("价格: ¥%.2f\n", price)
fmt.Printf("库存: %d\n", stock)
fmt.Printf("是否上架: %t\n", isOnSale)
fmt.Printf("\n最大重试次数: %d\n", MaxRetry)
fmt.Printf("当前季节: %d (夏天)\n", Summer)
}
掌握了变量和常量,下一节我们来看看Go有哪些数据类型!
