Go 语言变量声明_定义_赋值(图文讲解)

发布于: 2020-11-10 11:09:37 作者: 犬小哈 最后修订时间: 2020-11-18 14:52:16

编程中可以说最常见的就是变量了,主要被用来存储各种类型数据。

关于变量的类型,主要有:

  • 整型
  • 浮点型
  • 布尔型
  • 结构体
  • ...

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 :=

图示:

go编译报错

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)

代码输出:

犬小哈

注意: 匿名变量不占用命名空间,也不会占用内存。匿名变量与匿名变量直接不会因为多次声明而无法使用。