前言
学习任何一门编程语言,都要从语言的基础语法学起。变量与数据类型是编程中最常见且最基础的概念。本章将介绍Go语言中基本的变量和数据类型。
如果读者有其他编程语言基础,特别是C语言,那么对本章内容的学习将会非常轻松。如果读者没有编程语言基础也没有关系,因为本章的内容易于理解。
Go语言变量
变量是用来存储用户数据的。在编程过程中,会有许多不同的对象类型,那么对于不同的对象类型,我们就需要不同的变量类型来存储不同类型的用户数据。
编程语言中常见的数据类型有整型、浮点型、布尔型和结构体等。Go语言的每个变量都有自己的类型,在使用它们之前,必须先经过声明。
声明变量
-
标准格式:
-
变量的声明以关键字
var
开头,后接变量类型,行尾没有其他标点符号。 -
Go语言变量的标准声明格式如下:
-
var 变量名 变量类型
-
例如,声明变量
num
的类型为int
:
var num int
-
批量格式
-
在实际编程过程中,我们往往需要同时声明多个变量,这种情况下我们可以使用批量格式。
-
使用关键字var和小括号,可以同时声明多个变量。
-
Go语言变量的批量声明格式如下:
-
var(
a int
b string
c bool
)
初始化变量
Go语言在声明变量时,会自动对每个变量对应的内存区域进行初始化,即每个变量会有其类型对应的默认值:
-
整型和浮点型变量的默认值为0。
-
字符串变量的默认值为空字符串。
-
布尔型变量默认为false。
-
切片、映射、函数和指针变量默认为nil。
-
注意:
nil
相当于其他编程语言中的null、None和NULL等,指代零值,在Go语言中只能赋值给切片、映射、函数、接口、指针或通道类型。
-
1. 标准格式
-
Go 语言的标准初始化格式如下:
var 变量名 变量类型 = 表达式
例如:
var num int = 1
2. 编辑器推导类型格式
-
在标准格式基础上,把变量类型省略后,编辑器会根据等号右边的表达式推导变量的类型。
例如: 使用编辑器推导类型格式初始化变量 age 值为 20:
var age = 20
3. 短变量声明并初始化
-
变量声明并初始化有一种更为简洁的写法。
-
使用短变量声明并初始化时,编译器同样会根据等号右边的表达式推导变量的类型。
-
相对于前两种变量的初始化方法,短变量声明并初始化方法在开发中使用最为普遍。
-
短变量声明法无法作为全局变量使用!
-
例如:
age := 20
-
使用这种方法,我们可以同时给多个变量赋值,例如:
编写代码🖋
package main
import "fmt"
func main() {
name, age := "Tim", 18
fmt.Println("name", name)
fmt.Println("age", age)
}
运行结果
name Tim
age 18
-
但是,使用短变量声明并初始化时,需注意变量重复声明的情况:
编写代码🖋
package main
import "fmt"
func main() {
var name string
name := "Tim"
fmt.Println("name:", name)
}
运行结果
# command-line-arguments
./test.go:13:7: no new variables on left side of :=
-
很显然,编译器报错:在
:=
的左边没有新变量出现,因为name
变量已经在代码的上面
已经被声明了,我们重新编写代码。
编写代码🖋
package main
import "fmt"
func main() {
var name string
name, age := "Tim", 18
fmt.Println("name:", name)
fmt.Println("age", age)
}
运行结果
name: Tim
age 18
PS:在多个短变量声明并初始化中,应至少有一个新声明的变量出现在左值中,这样即使其他变量名存在重复声明的情况,编译器也不会报错。
4. 变量值交换
-
实际编程中,我们经常会用到变量值的交换,比如需要交换变量
a
和变量b
的值,可通过中间变量c
进行交换,代码如下:
编写代码🖋
package main
import "fmt"
func main() {
var c int
a := 1
b := 2
c = a
a = b
b = c
fmt.Println(a)
fmt.Println(b)
}
运行结果
2
1
-
在Go语言中,变量值的交换可以不再使用这种复杂的写法,而是通过多重赋值的特性,完成变量值的交换工作。
编写代码🖋
package main
import "fmt"
func main() {
a := 1
b := 2
a, b = b, a
fmt.Println(a)
fmt.Println(b)
}
运行结果
2
1
PS: 多重赋值时,变量的左值和右值按照从左到右的顺序依次赋值。
5. 匿名变量
-
在赋值给多个变量时,如果存在不需要接收值的变量,可以使用匿名变量来代替。
-
匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明。
编写代码🖋
package main
import "fmt"
func RetData() (int, int) {
return 10, 20
}
func main() {
a, _ := RetData()
_, b := RetData()
fmt.Println(a, b)
}
运行结果
10 20
-
RetData()是我们自定义的一个函数,对于它的每次调用,会返回10和20两个整型数值。
-
调用RetData()函数,使用变量a接收第一个返回值,第二个返回值由匿名变量接收。
-
调用RetData()函数,使用变量b接收第二个返回值,第一个返回值由匿名变量接收。
-
由于匿名变量不占用命名空间,也不会分配系统内存,匿名变量与匿名变量之间不会因为多次声明而无法使用。
小结
-
变量是用来存储用户数据的,Go语言的每个变量都有自己的类型,在使用它们之前,必须先经过声明。
-
短变量声明并初始化方法在开发中使用最为普遍。
-
在赋值给多个变量时,如果存在不需要接收值的变量,可以使用匿名变量来代替。