
Go 是一门静态强类型语言,变量必须先声明(或定义)才能使用,而且类型一旦确定不可改变。
1单变量声明的 3 种方式
1.1标准形式(var关键字+显式类型)
var name string = "Tom"
var age int = 18
var isMarried bool = false
- 可以写在函数内外(函数外就是包级变量)
- 不赋值时自动获得零值(下面会详细讲)
1.2类型推断(var+自动推断)
编译器根据初始值自动推断类型,写法更简洁:
var name = "Tom" // 推断为 string
var age = 18 // 推断为 int
var height = 1.88 // 推断为 float64
var isMarried = true // 推断为 bool
1.3简短声明(:=)——最常用!
只能在函数内部使用,Go 独有的语法糖:
func main() {
name := "Tom" // 自动推断为 string
age := 28 // 自动推断为 int
score := 99.5 // 自动推断为 float64
}
重要规则:
:=左侧至少要有一个新变量- 同一个作用域内不能对已存在的变量再次使用
:=
错误示例:
func main() {
x := 100
// x := 200 // 编译错误!no new variables on left side of :=
x = 200 // 正确,这是赋值,不是重新声明
}
正确示例(至少有一个新变量):
func main() {
x := 100
fmt.Println(&x)
x, y := 200, "abc" // x 是已存在变量,y 是新变量 → 合法
fmt.Println(&x, x, y)
}
2多变量声明的 4 种方式
2.1一次声明多个变量(同类型)
var a, b, c int
var name1, name2, name3 string = "张三", "李四", "王五"
2.2一次声明多个变量(不同类型)
var name, age, isStudent = "Lucy", 20, true
2.3并行赋值(最常见)
var width, height = 100, 200
width, height = 300, 400 // 交换值超方便
width, height = height, width // 不用临时变量就能交换!
2.4变量组声明(推荐用于包级变量,当然函数内也能使用)
var (
appName string = "GoWeb"
version string = "1.0.0"
debug bool = true
maxRetry int = 5
pi float64 = 3.14159
)
3Go的零值(默认值)机制
在Go语⾔中,每种类型都有相应的默认值,我们将其称为零值(zero value)。 Go不会出现“未初始化变量”这种运行时错误,所有变量声明后都会自动获得对应类型的零值:
| 类型 | 零值 |
|---|---|
| int / float | 0 |
| bool | false |
| string | ""(空字符串) |
| pointer | nil |
| slice/map/chan | nil |
| struct | 所有字段都是零值 |
var a int
var b string
var c bool
var d *int
fmt.Printf("%d %q %t %v\n", a, b, c, d) // 0 "" false <nil>
4匿名变量“_”
在多返回值函数中经常只关心部分返回值,用 _ 丢弃不需要的值:
func getUser() (string, int, bool) {
return "Tom", 18, true
}
func main() {
name, _, isVip := getUser() // 只关心名字和是否VIP
_, age, _ := getUser() // 只关心年龄
fmt.Println(name, age, isVip)
}
Python 程序员会感觉非常亲切,和
for _, item in enumerate(arr)完全一样!
5变量命名规范与注意事项(必背)
| 规则 | 示例 | 说明 |
|---|---|---|
| 只能包含字母、数字、下划线 | user_name, age2 | |
| 必须以字母或下划线开头 | _temp, Name | 不能以数字开头 |
| 区分大小写 | age ≠ Age | |
| 不能是 25 个关键字 | var, func, package 等 | |
| 建议使用驼峰命名法 | userName, maxRetryCount | 不要用下划线(除非包级常量) |
| 见名知意,越短越好 | i, j, k(循环索引) | 短变量只在小作用域使用 |
| 包级变量建议大驼峰 | AppVersion, MaxConnections | 导出变量首字母大写 |
6常见编译错误及解决办法
// 错误1:变量声明了没使用
var temp int // 编译报错:temp declared and not used
// 错误2:重复使用 := 声明已存在变量
x := 10
x := 20 // 编译错误:no new variables on left side of :=
// 错误3:函数外使用 :=
package main
name := "global" // 编译错误!只能在函数内部使用
7本节完整示例代码
package main
import "fmt"
// 包级变量(推荐使用 var() 方式)
var (
AppName = "GoStudy"
Version = "1.0.0"
DebugMode = true
)
func main() {
// 1. 标准声明
var name string = "Tom"
var age int = 28
// 2. 类型推断
var city = "Beijing"
// 3. 简短声明(最常用)
score := 99.5
isLogin := true
// 4. 多变量声明
x, y, z := 10, 20, 30
// 5. 匿名变量
username, _, vip := getUserInfo()
fmt.Printf("欢迎来到 %s v%s\n", AppName, Version)
fmt.Println(name, age, city, score, isLogin)
fmt.Println(x, y, z)
fmt.Println("用户:", username, "VIP:", vip)
}
func getUserInfo() (string, int, bool) {
return "Jerry", 35, true
}
运行结果:
欢迎来到 GoStudy v1.0.0
Tom 28 Beijing 99.5 true
10 20 30
用户: Jerry VIP: true
8小结(背会这5点就够了)
- 函数内最常用
变量名 := 值 - 函数外只能用
var(推荐用var()批量声明) - 声明了必须使用,否则编译不通过
- 同一个作用域内,
:=左侧至少有一个新变量 - 不关心的返回值用
_丢弃
掌握了变量声明,你就已经迈出了学习 Go 的最重要一步!