GO语言基础:变量

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


1. 什么是变量?

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


2. 变量声明

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

go 复制代码
var 变量名 数据类型 = 初始值

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

示例 1:声明并初始化变量

go 复制代码
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:声明多个变量

可以一次声明多个同类型或不同类型的变量:

go 复制代码
var a, b, c int = 1, 2, 3                 // 三个 int 变量
var x, y, z = 10, "hello", 3.14           // 类型推断:x int, y string, z float64

示例 3:只声明不初始化(使用零值)

go 复制代码
var score int      // score 被赋值为 0
var message string // message 被赋值为 ""
var flag bool      // flag 被赋值为 false

类型推断

如果声明时提供了初始值,Go 可以根据初始值自动推断变量类型,因此你可以省略类型:

go 复制代码
var city = "北京"   // 编译器推断 city 为 string 类型
var count = 100     // 推断为 int

3. 短变量声明

在函数内部,你可以使用更简洁的 := 符号来声明并初始化变量,这称为短变量声明。它的语法是:

go 复制代码
变量名 := 初始值

注意:

  • := 只能在函数内部使用(不能在包级别使用)。
  • 它同时完成了声明和初始化,并且 Go 会自动推断类型。
  • 左侧必须至少有一个新变量(如果所有变量都已声明过,则会编译错误)。

示例 4:使用短变量声明

go 复制代码
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:多个变量的短声明

go 复制代码
a, b, c := 1, "hello", 3.14   // a int, b string, c float64

注意事项

  • 短变量声明中的 := 左侧必须至少有一个新变量。如果所有变量都已经声明过,则不能使用 :=,而应该使用普通的赋值 =
go 复制代码
x := 10
x := 20   // 编译错误:no new variables on left side of :=
x = 20    // 正确:赋值
  • 短变量声明可以配合函数返回值使用,例如:
go 复制代码
n, err := fmt.Println("hello")   // n 和 err 都是新变量

4. 变量作用域

变量的作用域指的是变量在程序中可以被访问的范围。Go 的作用域是基于代码块(由 {} 包围的区域)的。主要有以下几种:

4.1 包级作用域

在函数外部(包级别)声明的变量,可以被同一个包中的所有文件访问(如果变量名首字母大写,还可以被其他包访问,这属于导出标识符的范畴,今天我们只关注内部)。

go 复制代码
package main

import "fmt"

var global = "我是全局变量"   // 包级变量

func main() {
    fmt.Println(global)   // 可以访问
}

4.2 函数级作用域

在函数内部声明的变量,只能在该函数内部访问。

go 复制代码
func main() {
    var local = "我是局部变量"
    fmt.Println(local)
}

func another() {
    // fmt.Println(local)  // 错误:local 未定义,不在作用域内
}

4.3 块作用域

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

go 复制代码
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)

如果在内部作用域声明了一个与外部作用域同名的变量,内部变量会"遮蔽"外部变量,即在内部作用域中访问的是内部变量,外部变量被暂时隐藏。

go 复制代码
var name = "全局"

func main() {
    name := "局部"   // 遮蔽了全局的 name
    fmt.Println(name)   // 输出 "局部"
}

了解作用域能帮助你避免变量命名冲突和意外覆盖。


5. 总结

  • 变量声明 :使用 var 关键字,可以指定类型或不指定(类型推断),可以在函数内部或包级别使用。
  • 短变量声明 :使用 :=,只能在函数内部使用,简洁方便。
  • 变量作用域:变量在声明它的代码块内有效,内层块可以访问外层块变量,但内层同名变量会遮蔽外层变量。

希望这些内容能帮助你理解 Go 语言中的变量!如果还有疑问,欢迎继续提问。加油,Go 小白!

相关推荐
liangbm319 小时前
AI-ViewNote:把网课和会议视频自动卷成结构化笔记
ai·typescript·go·软件构建·开源软件·react·桌面软件
我叫黑大帅21 小时前
Gin 实战入门:从环境搭建到企业级常用特性全解析
后端·面试·go
我叫黑大帅1 天前
Gin 日志体系详解
后端·面试·go
F1FJJ1 天前
Shield CLI v0.3.3 新增 PostgreSQL 插件:浏览器里管理 PG 数据库
网络·网络协议·docker·postgresql·容器·go
mCell1 天前
【万字长文】从 AI SDK 到 mini-opencode:一次很巧的 Go Agent 架构实践
架构·go·agent
jump_jump1 天前
深入理解 Go Context:从原理到实战(基于 Go 1.26)
go·源码
哈里谢顿1 天前
golang目前遇到的面试题
go
哈里谢顿1 天前
python与golang性能差异对比
go
前端Hardy3 天前
Wails v3 正式发布:用 Go 写桌面应用,体积仅 12MB,性能飙升 40%!
前端·javascript·go
golang学习记3 天前
Go 语言生产环境必备包清单
go