Go基础-变量和常量

2022/11/18 go

# 变量

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

# 数据类型

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

# 布尔型

布尔型的值只可以是常量 true 或者 false。

一个简单的例子:var b bool = true。

# 数字类型

整型 int 和浮点型 float32float64Go语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。

# 字符串类型

字符串string就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。

# 派生类型

  • 指针类型(Pointer)
  • 数组类型(array)
  • 结构化类型(struct)
  • Channel 类型 (chan)
  • 函数类型
  • 切片类型
  • 接口类型(interface)
  • Map 类型

Go 语言中不同类型的变量,需要先声明,才能够被使用。

# 声明变量

声明变量需以 var 关键字开头,变量名放在中间,变量类型放在最后。

语法:

var 变量名 变量类型
1

注意: 行尾无分号 ;

示例:

var a int                 // 声明一个整型的变量,被用来保存整数数值
var b string              // 声明一个字符串类型的变量
1
2

你还可以通过var()来一次性声明多个变量:

语法:

var (
	变量名1 变量类型1
	变量名2 变量类型2
	变量名3 变量类型3
)
1
2
3
4
5

声明多个变量的时候数据类型可以不同

示例:

var (
	a int
    b string
    b bool
)
1
2
3
4
5

# 初始化与定义变量

初始化变量有如下几种写法:

# 带数据类型格式

var 变量名 变量类型 = 变量值
1

例如想初始化一个整形,可以这样写:

var age int = 18 // 初始化一个整型,变量名为 age, 初始值为 18 的变量
1

# 编译器推导类型格式

这种跟jspython等语言类似,不指定数据类型,编译器会根据=右边的值推导出对应的数据类型

var 变量名 = 变量值
1

初始化一个整形:

var age = 18
1

# 短变量声明与初始化

这也是变量推导的一种写法, 但是与上面不同的是使用了:=来省略了var,使得更加简化

变量名 := 变量值
1

初始化一个整形:

age := 18
1

注意: 因为使用了 := , 而不是赋值的 =, 这就限制了等号左边的变量名必须是没有定义过的变量名,否则将会发生编译错误

举个反例,代码如下:

// 声明一个整型 age 变量
var age int
// 再次声明与赋值
age := 18
1
2
3
4

运行会编译错误:

no new variables on left side of :=
// 报错信息意思表示: :=左边的变量已经被声明了。
1
2

image-20221118181424191

# 多变量同时赋值

变量1,变量2 = 变量2,变量1
1

假设这样一个场景,需要交互互相两个变量的值,比如冒泡算法的互换前后两个值,先看看传统的写法:

为了达到交换后数据的正确性,通常都需要定义一个临时中间变量来做中转

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)
1
2
3
4
5
6
7
8
9
10

代码输出结果:

200 100
1

image-20221118181859045

但是,在 Go 语言中利用多重赋值的特性,还可以这样写:

var a int = 100
var b int = 200

a, b = b, a
fmt.Println(a, b)
1
2
3
4
5

代码运行结果同样是:

200 100
1

image-20221118182136855

# 匿名变量

匿名变量就是一个没有名字的变量,通常用下划线 _ 来表示。

那么什么场景会用到匿名变量呢?

比如一个函数返回两个值或者多个值的时候,但我只要用到其中一个,又不想声明一个变量来保存这个多余的值,这时匿名变量就可以用的上了

func getRes() (string, int) {
	return "go", 18
}
func main() {
	var str, _ = getRes()
	fmt.Println(str)
}
1
2
3
4
5
6
7

image-20221118182937911

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

# 常量

相对于 Go 语言变量,常量是一个不可改变的值,如圆周率 π 等。

常量在代码的编译期就已经确定了,而不是运行时。每种常量的潜在类型都是基础类型:booleanstring数字

# 常量定义&声明

定义一个 常量非常简单,它和变量的声明方式类似,将 var 关键字替换成 const 即可,代码如下:

const pi = 3.141592
const domain = "hello"
1
2

# 定义多个 Go 语言常量

常量也是可以同时定义多个的,方式和变量很类似,代码如下:

const (
 	pi = 3.141592
 	domain = "hello"
)
1
2
3
4