Go 语言变量声明_定义_赋值(图文讲解)
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ; - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 54w+ 字,讲解图 2476+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1900+ 小伙伴加入学习 ,欢迎点击围观
编程中可以说最常见的就是变量了,主要被用来存储各种类型数据。
关于变量的类型,主要有:
- 整型
- 浮点型
- 布尔型
- 结构体
- ...
Go 语言中不同类型的变量,需要先声明,才能够被使用。
Go 语言 - 声明变量
1. 标准格式
Go 语言中声明变量需以 var
关键字开头,变量名放在中间,变量类型放在最后。
var 变量名 变量类型
注意: 行尾无分号
;
。
下面是 Go 语言常见的基本变量声明:
var a int // 声明一个整型的变量,被用来保存整数数值
var b string // 声明一个字符串类型的变量
var c []float32 // 声明一个 32 位浮点切片类型的变量
var d func() bool // 声明一个返回值为布尔型的函数变量,将函数以变量的形式保存起来
var e struct { // 声明一个结构体类型的变量,结构体中声明了一个整型的 `f` 变量
f int
}
2. 批量格式
若觉得每次前面都要定义 var
非常繁琐, 还可以通过 var
和括号来批量声明:
var (
a int
b string
c []float32
d func() bool
e struct {
f int
}
)
Go 语言 - 初始化与定义变量
Go 语言中,初始化变量有如下几种写法:
1. 标准格式
var 变量名 变量类型 = 变量值
例如想初始化一个人的年龄,可以这样写:
var age int = 18 // 初始化一个整型,变量名为 age, 初始值为 18 的变量
2. 编译器推导类型格式
我们还可以在上述格式的基础上,再精简点:
var age = 18
无需定义变量类型,编译器会根据等号右边的变量值,来推断 age
的变量类型。
3. 短变量声明与初始化
还可以在第二种的基础上,再做简化:
age := 18
这也是 Go 语言中变量推导的一种写法,但是与上面不同的是:
注意: 因为使用了
:=
, 而不是赋值的=
, 这就限制了等号左边的变量名必须是没有定义过的变量名,否则将会发生编译错误。
举个反例,代码如下:
// 声明一个整型 age 变量
var age int
// 再次声明与赋值
age := 18
编译报错如下:
no new variables on left side of :=
图示:
PS: 报错信息意思表示:
:=
左边的变量已经被声明了。
Go语言 - 多变量同时赋值
假设这样一个场景,需要交互互相两个变量的值,先看看传统的写法:
var a int = 100 // 定义变量 a
var b int = 200 // 定义变量 b
var c int // 定义一个中间变量
// 开始互相交互 a 与 b 变量的值
c = a
a = b
b = c
fmt.Println(a, b)
为了达到交换后数据的正确性,通常都需要定义一个临时中间变量来做中转,如上所示。
代码输出结果:
200 100
但是,在 Go 语言中利用多重赋值的特性,还可以这样写:
var a int = 100
var b int = 200
a, b = b, a
fmt.Println(a, b)
代码运行结果同样是:
200 100
Go 语言 - 匿名变量
匿名变量就是一个没有名字的变量,通常用下划线 _
来表示。
这玩意什么场景下会用到呢?
举个例子,假设有这种场景,需要调用某个函数 findStudent()
,来查询数据库中某个学生的数据,函数会返回两个数值,分别是:
- 学生姓名;
- 学生年龄;
但是呢,我们只需要获取学生的姓名就行了,年龄并不需要,但是又不想为其单独声明一个变量,这时匿名变量就有用武之地了:
func findStudent() (string, int) {
return "犬小哈", 100
}
name, _ := findStudent()
fmt.Println(name)
代码输出:
犬小哈
注意: 匿名变量不占用命名空间,也不会占用内存。匿名变量与匿名变量直接不会因为多次声明而无法使用。