2.1 变量与常量
2.1 变量与常量
变量和常量是编程语言的基础。本节将详细介绍Go语言中变量和常量的声明、使用和特点。
变量
变量声明
Go语言提供了多种变量声明方式。
方式一:标准声明
var name string
var age int
var isStudent bool
方式二:声明并初始化
var name string = "张三"
var age int = 25
var isStudent bool = true
方式三:类型推导
var name = "张三" // 自动推导为string
var age = 25 // 自动推导为int
var isStudent = true // 自动推导为bool
方式四:短变量声明(最常用)
name := "张三"
age := 25
isStudent := true
注意:短变量声明只能在函数内部使用。
方式五:批量声明
var (
name string = "张三"
age int = 25
isStudent bool = true
)
完整示例
package main
import "fmt"
func main() {
// 标准声明
var x int
x = 10
fmt.Println("x =", x)
// 声明并初始化
var y int = 20
fmt.Println("y =", y)
// 类型推导
var z = 30
fmt.Println("z =", z)
// 短变量声明
w := 40
fmt.Println("w =", w)
// 批量声明
var (
a = 1
b = 2
c = 3
)
fmt.Println("a, b, c =", a, b, c)
}
零值
未初始化的变量会被赋予零值:
var i int // 0
var f float64 // 0.0
var b bool // false
var s string // ""(空字符串)
var p *int // nil
示例:
package main
import "fmt"
func main() {
var i int
var f float64
var b bool
var s string
fmt.Printf("int: %d\n", i) // 0
fmt.Printf("float64: %f\n", f) // 0.000000
fmt.Printf("bool: %t\n", b) // false
fmt.Printf("string: %q\n", s) // ""
}
多变量声明
// 同类型多变量
var a, b, c int
var x, y, z = 1, 2, 3
// 不同类型多变量
var (
name string = "Go"
age int = 14
active bool = true
)
// 短变量声明
name, age := "Go", 14
变量赋值
// 单个赋值
x := 10
x = 20
// 多重赋值
a, b := 1, 2
a, b = b, a // 交换值
// 使用函数返回值
func getValues() (int, string) {
return 42, "answer"
}
num, str := getValues()
匿名变量
使用下划线_忽略不需要的值:
func getValues() (int, string, bool) {
return 1, "hello", true
}
// 只需要第一个和第三个值
num, _, flag := getValues()
变量作用域
局部变量
func main() {
x := 10 // 局部变量,仅在main函数内可见
fmt.Println(x)
}
全局变量
package main
import "fmt"
var globalVar = "我是全局变量" // 全局变量
func main() {
fmt.Println(globalVar)
}
func otherFunc() {
fmt.Println(globalVar) // 其他函数也可以访问
}
块级作用域
func main() {
x := 10
if true {
y := 20 // y只在if块内可见
fmt.Println(x, y)
}
// fmt.Println(y) // 错误:y在此处不可见
}
常量
常量是在编译时就确定的值,运行时不能改变。
常量声明
const PI = 3.14159
const GREETING = "Hello, World!"
const MAX_SIZE = 100
批量声明常量
const (
StatusOK = 200
StatusNotFound = 404
StatusError = 500
)
常量的特点
-
必须在声明时初始化
const x = 10 // 正确
const y int // 错误:常量必须初始化
-
值不可修改
const x = 10
x = 20 // 错误:不能修改常量
-
可以是任意基本类型
const (
name = "Go"
version = 1.21
active = true
)
iota枚举器
iota是Go的常量计数器,用于创建枚举值。
基本用法
const (
Sunday = iota // 0
Monday // 1
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)
跳过某些值
const (
a = iota // 0
b // 1
_ // 2(跳过)
c // 3
)
从1开始
const (
January = iota + 1 // 1
February // 2
March // 3
April // 4
)
位运算
const (
Read = 1 << iota // 1 << 0 = 1
Write // 1 << 1 = 2
Execute // 1 << 2 = 4
)
复杂表达式
const (
KB = 1 << (10 * iota) // 1 << 0 = 1
MB // 1 << 10 = 1024
GB // 1 << 20 = 1048576
TB // 1 << 30 = 1073741824
)
完整示例
package main
import "fmt"
// 定义常量
const (
PI = 3.14159
E = 2.71828
AUTHOR = "Go Team"
)
// 使用iota定义枚举
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
// 文件权限
const (
Read = 1 << iota // 1
Write // 2
Execute // 4
)
func main() {
fmt.Println("PI =", PI)
fmt.Println("E =", E)
fmt.Println("AUTHOR =", AUTHOR)
fmt.Println("\n星期枚举:")
fmt.Println("Sunday =", Sunday)
fmt.Println("Monday =", Monday)
fmt.Println("Saturday =", Saturday)
fmt.Println("\n文件权限:")
fmt.Println("Read =", Read)
fmt.Println("Write =", Write)
fmt.Println("Execute =", Execute)
fmt.Println("Read+Write =", Read|Write)
}
变量 vs 常量
| 特性 | 变量 | 常量 |
|---|---|---|
| 声明关键字 | var |
const |
| 是否可修改 | 可以 | 不可以 |
| 是否必须初始化 | 否 | 是 |
| 作用域 | 局部/全局 | 局部/全局 |
| 类型推导 | 支持 | 支持 |
命名规范
变量命名
// 驼峰命名法
userName := "张三"
userAge := 25
isActive := true
// 首字母大写表示导出(公开)
var UserName string // 可被其他包访问
var userName string // 仅包内可访问
常量命名
// 全大写(可选)
const MAX_SIZE = 100
const DEFAULT_TIMEOUT = 30
// 驼峰命名法(推荐)
const MaxSize = 100
const DefaultTimeout = 30
命名建议
-
使用有意义的名称
-
避免使用单字母(除了循环变量)
-
缩写要全部大写或全部小写:
userID、HTTPServer -
包级别的变量和常量首字母大写表示导出
类型转换
Go不支持隐式类型转换,必须显式转换。
var i int = 42
var f float64 = float64(i)
var u uint = uint(f)
// 字符串转换
s := string(65) // "A"
// 数值转字符串
import "strconv"
str := strconv.Itoa(42) // "42"
练习
练习1:变量声明
声明并初始化以下变量:
-
姓名(字符串)
-
年龄(整数)
-
身高(浮点数)
-
是否学生(布尔值)
练习2:变量交换
不使用第三个变量,交换两个变量的值。
a := 10
b := 20
// 交换a和b的值
练习3:常量定义
定义一个表示一周七天的常量枚举。
练习4:文件大小
使用iota定义文件大小单位(B, KB, MB, GB, TB)。
小结
本节我们学习了:
-
变量的多种声明方式
-
变量的零值和作用域
-
常量的声明和使用
-
iota枚举器的用法
-
变量和常量的命名规范
-
类型转换
掌握变量和常量是学习Go语言的基础。下一节,我们将学习Go语言的数据类型。
上一节: 1.3 第一个Go程序 | 下一节: 2.2 数据类型