变量

2022-01-16 GoLang 大约 3 分钟

变量相当于内存中一个数据储存空间的表示,不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位。

# 初始化变量

go语言在声明变量时,自动对变量对应的内存区域进行初始化操作。每个变量会初始化其类型的默认值,例如:

  • 整型和浮点型变量的默认为0。
  • 字符串变量的默认值为空字符串。
  • 布尔型变量的默认为bool。
  • 切片、函数、指针变量的默认为nil。

# 声明变量

package main

import "fmt"

func main() {
	// 声明一个整型类型的变量,可以保存整型数值。
	var a int

	// 声明一个字符串类型的变量
	var b string

	// 声明一个32位浮点切片类型的变量,浮点切片表示由多个浮点类型组成的数据结构
	var c []float32

	// 声明一个返回值为布尔类型的函数变量,这种形式一般用于回调函数,即将函数以变量的形式保存下来,在需要的时候重新调用这个函数
	var d func() bool

	// 声明一个结构体类型的变量,这个结构体拥有一个整型的x字段。
	var e struct {
		x int
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

相关信息

go语言的每个变量都拥有自己的类型,必须经过声明才能开始用。

# 标准格式

go语言的变量声明格式为:var 变量名 变量类型

// 变量声明以关键字var开头,后置变量类型,行尾无须分号。
var num int

// 变量的赋值
num = 10

// 声明并赋值
var num int = 12
1
2
3
4
5
6
7
8

注意

// 这种是错误的 类型和值不对应
var num int = 12.5
1
2

# 批量格式

觉得每行都用var声明变量比较繁琐?没关系,还有一种为懒人提供的定义变量的方法:

// 同时声明多个变量并赋值
var n1, n2, n3 int
fmt.Println(n1, n2, n3) // 0 0 0

// 同时声明多个变量并赋值
var n1, n2, n3 = 10, "jack", 7.8
fmt.Println(n1, n2, n3) 10 jack 7.8

// 使用var 关键字和括号,可以将一组变量定义放在一起
var (
	a int
    b string
    c []float32
    d func() bool
    e struct {
        x int
    }
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 自动类型推断

在标准格式的基础上,将int省略后,编译器会尝试根据等号右边的表达式推到变量的类型。

var hp = 100
1

等号右边的部分在编译原理里被称为“右值”。

下面是编译器根据右值推到变量类型完成初始化的例子

var attack = 40

var defence = 20

var damage Rate float32 = 0.17

var damage float32(attack - defence) * damage Rate

fmt.Println(damage)
1
2
3
4
5
6
7
8
9

# 短变量声明

var的变量声明还有一种更为精简的写法,例如:

hp := 100
str := "str"

// 同时声明多个变量并赋值
n1, n2, n3 := 10, "str", 200

fmt.Println(n1, n2, n3) // 10, str 200
1
2
3
4
5
6
7

这是go语言的推导声明写法,编译器会自动根据右值类型推断出左值的对应类型。

相关信息

由于使用了:=,而不是赋值的=,因此推导声明写法的左值变量必须是没有定义过的变量。若定义过,将会发生编译错误。

# 多重赋值

go语言的多重赋值,可以轻松完成变量的交换

// 多重赋值时,变量的左值和右值按从左到右的顺序赋值
var q int = 100

var w int = 200

q, w = w, q

fmt.Println(q, w) // 200 100
1
2
3
4
5
6
7
8

# 匿名变量

在使用多重赋值时,如果不需要在左值中接受变量,可以使用匿名变量。匿名变量的表现是一个_下划线,使用匿名变量时,只需要在变量声明的地方使用下划线即可。

func main() {
    a, _ := getData()

    _, b := getData()

    fmt.Println(a, b) // 100 200
}

func getData() (int, int) {
	return 100, 200
}
1
2
3
4
5
6
7
8
9
10
11

# 全局变量

package main

import "fmt"

// 定义全局变量
var n4 = 34
var n5 = 23

func main() {
	// 同时声明多个变量并赋值 -- 局部变量
	n1, n2, n3 := 10, "str", 200
	fmt.Println(n1, n2, n3, n4, n5)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
上次编辑于: 2023年7月4日 09:36