GO语言基础:变量

5 阅读4分钟

你好!欢迎学习 Go 语言!今天我们一起来学习 Go 中的变量。我会从最基础的概念开始,分别讲解变量声明、短变量声明和变量作用域,并提供简单易懂的示例。让我们开始吧!


1. 什么是变量?

变量是程序中用于存储数据的一个“容器”。你可以把它想象成一个带有标签的盒子,盒子里可以放不同类型的数据(比如数字、文本等),而标签就是变量名,方便我们后续找到和使用这个数据。


2. 变量声明

在 Go 中,使用 var 关键字来声明变量。变量声明的基本语法是:

var 变量名 数据类型 = 初始值

其中 = 初始值 是可选的,如果不给初始值,变量会被赋予该类型的零值(比如 int 的零值是 0string 的零值是空字符串 "")。

示例 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 块作用域

{} 内部(例如 ifforswitch 或自定义代码块)声明的变量,只能在该块内部及其子块中访问。

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 小白!