你好!欢迎学习 Go 语言!今天我们一起来学习 Go 中的变量。我会从最基础的概念开始,分别讲解变量声明、短变量声明和变量作用域,并提供简单易懂的示例。让我们开始吧!
1. 什么是变量?
变量是程序中用于存储数据的一个“容器”。你可以把它想象成一个带有标签的盒子,盒子里可以放不同类型的数据(比如数字、文本等),而标签就是变量名,方便我们后续找到和使用这个数据。
2. 变量声明
在 Go 中,使用 var 关键字来声明变量。变量声明的基本语法是:
var 变量名 数据类型 = 初始值
其中 = 初始值 是可选的,如果不给初始值,变量会被赋予该类型的零值(比如 int 的零值是 0,string 的零值是空字符串 "")。
示例 1:声明并初始化变量
package main
import "fmt"
func main() {
var age int = 25 // 声明一个 int 类型变量 age,初始值为 25
var name string = "小明" // 声明一个 string 类型变量 name,初始值为 "小明"
var isStudent bool = true // 声明一个 bool 类型变量 isStudent,初始值为 true
fmt.Println(age, name, isStudent)
}
示例 2:声明多个变量
可以一次声明多个同类型或不同类型的变量:
var a, b, c int = 1, 2, 3 // 三个 int 变量
var x, y, z = 10, "hello", 3.14 // 类型推断:x int, y string, z float64
示例 3:只声明不初始化(使用零值)
var score int // score 被赋值为 0
var message string // message 被赋值为 ""
var flag bool // flag 被赋值为 false
类型推断
如果声明时提供了初始值,Go 可以根据初始值自动推断变量类型,因此你可以省略类型:
var city = "北京" // 编译器推断 city 为 string 类型
var count = 100 // 推断为 int
3. 短变量声明
在函数内部,你可以使用更简洁的 := 符号来声明并初始化变量,这称为短变量声明。它的语法是:
变量名 := 初始值
注意:
:=只能在函数内部使用(不能在包级别使用)。- 它同时完成了声明和初始化,并且 Go 会自动推断类型。
- 左侧必须至少有一个新变量(如果所有变量都已声明过,则会编译错误)。
示例 4:使用短变量声明
package main
import "fmt"
func main() {
name := "李华" // 相当于 var name string = "李华"
age := 20 // 相当于 var age int = 20
height := 1.75 // 相当于 var height float64 = 1.75
fmt.Printf("姓名:%s,年龄:%d,身高:%.2f\n", name, age, height)
}
示例 5:多个变量的短声明
a, b, c := 1, "hello", 3.14 // a int, b string, c float64
注意事项
- 短变量声明中的
:=左侧必须至少有一个新变量。如果所有变量都已经声明过,则不能使用:=,而应该使用普通的赋值=。
x := 10
x := 20 // 编译错误:no new variables on left side of :=
x = 20 // 正确:赋值
- 短变量声明可以配合函数返回值使用,例如:
n, err := fmt.Println("hello") // n 和 err 都是新变量
4. 变量作用域
变量的作用域指的是变量在程序中可以被访问的范围。Go 的作用域是基于代码块(由 {} 包围的区域)的。主要有以下几种:
4.1 包级作用域
在函数外部(包级别)声明的变量,可以被同一个包中的所有文件访问(如果变量名首字母大写,还可以被其他包访问,这属于导出标识符的范畴,今天我们只关注内部)。
package main
import "fmt"
var global = "我是全局变量" // 包级变量
func main() {
fmt.Println(global) // 可以访问
}
4.2 函数级作用域
在函数内部声明的变量,只能在该函数内部访问。
func main() {
var local = "我是局部变量"
fmt.Println(local)
}
func another() {
// fmt.Println(local) // 错误:local 未定义,不在作用域内
}
4.3 块作用域
在 {} 内部(例如 if、for、switch 或自定义代码块)声明的变量,只能在该块内部及其子块中访问。
func main() {
if x := 10; x > 5 {
y := 20
fmt.Println("x =", x) // 可以访问 x 和 y
fmt.Println("y =", y)
}
// fmt.Println(x) // 错误:x 在这里不可见
// fmt.Println(y) // 错误:y 在这里不可见
}
4.4 作用域遮蔽(Shadowing)
如果在内部作用域声明了一个与外部作用域同名的变量,内部变量会“遮蔽”外部变量,即在内部作用域中访问的是内部变量,外部变量被暂时隐藏。
var name = "全局"
func main() {
name := "局部" // 遮蔽了全局的 name
fmt.Println(name) // 输出 "局部"
}
了解作用域能帮助你避免变量命名冲突和意外覆盖。
5. 总结
- 变量声明:使用
var关键字,可以指定类型或不指定(类型推断),可以在函数内部或包级别使用。 - 短变量声明:使用
:=,只能在函数内部使用,简洁方便。 - 变量作用域:变量在声明它的代码块内有效,内层块可以访问外层块变量,但内层同名变量会遮蔽外层变量。
希望这些内容能帮助你理解 Go 语言中的变量!如果还有疑问,欢迎继续提问。加油,Go 小白!