Go语言基础之变量

1. 变量介绍

在Go语言中,变量是存储数据的基本单元,使用变量可以方便地处理数据,同时也可以提高程序的可读性和可维护性。

变量在Go语言中的定义格式为:

var 变量名 变量类型

其中,变量名表示变量的名称,变量类型表示变量的数据类型。

数据类型包括基本数据类型和复合数据类型:

1.1 基本数据类型

在Go语言中,基本数据类型包括:

整数类型:int、int8、int16、int32、int64

无符号整数类型:uint、uint8、uint16、uint32、uint64

浮点数类型:float32、float64

布尔类型:bool

字符类型:rune

字符串类型:string

1.2 复合数据类型

在Go语言中,复合数据类型包括:

数组类型

切片类型:slice

映射类型:map

结构体类型:struct

通道类型:channel

接口类型:interface

2. 变量的声明和赋值

声明变量和初始化变量的方式有很多种,在Go语言中,可以使用var关键字、:=运算符和new函数等方式进行变量的声明和赋值。

2.1 使用 var 关键字声明变量

在Go语言中,使用var关键字可以声明变量,格式如下:

var 变量名 变量类型

例如,声明一个字符串类型的变量:

var name string

声明多个变量可以使用如下方式:

var name string

var age int

var salary float64

2.2 使用 := 运算符声明变量

在Go语言中,使用:=运算符可以快速声明并初始化变量,格式如下:

变量名 := 值

例如,声明一个整数类型的变量并赋值:

age := 18

使用:=运算符声明的变量只能在函数内部使用。

2.3 使用 new 函数创建变量

在Go语言中,使用new函数可以创建指定类型的变量,并返回指向该变量的指针,格式如下:

变量指针 := new(变量类型)

例如,创建一个字符串类型的变量,并返回指向该变量的指针:

name := new(string)

3. 变量的值

在Go语言中,变量的值可以是任何类型的数据,也可以是nil值。

3.1 变量的类型转换

在Go语言中,可以使用类型转换操作符将一个变量的类型转换为另一个类型,格式如下:

变量名 := 变量类型(值)

例如,将一个int类型的变量转换为float64类型:

age := 18

salary := float64(age)

3.2 变量的初始值

在Go语言中,变量有一个默认的初始值,例如:

整数类型的变量的默认初始值是0

浮点数类型的变量的默认初始值是0.0

布尔类型的变量的默认初始值是false

字符串类型的变量的默认初始值是""

例如,创建一个整数类型的变量,未赋值时其值为默认值0

var age int

fmt.Println(age) // 输出:0

3.3 变量的零值

在Go语言中,变量的零值是指该变量的默认初始值,在main函数外声明的变量具有零值,格式如下:

var 变量名 变量类型

例如,创建一个字符串类型的变量,其零值为""

var name string

fmt.Println(name) // 输出:""

4. 常量

在Go语言中,常量是不能修改的值,它们在程序运行期间保持不变,声明常量使用const关键字,格式如下:

const 常量名称 = 值

例如,声明一个字符串类型的常量:

const name string = "Go语言教程"

在Go语言中,还可以在常量的列表中,自动填充相同类型常量的值,例如:

const (

name string = "Go语言教程"

age int = 18

salary float64 = 8888.88

)

在常量列表中,常量的值可以是表达式,但是表达式的结果必须是可以在编译时计算的,例如:

const (

a = 1 + 2

b = "hello" + "world"

)

5. 变量的作用域

在Go语言中,变量的作用域是指变量的可见范围,同一作用域内不能出现同名的变量。

5.1 全局变量

在函数外部声明的变量称为全局变量,全局变量可以被程序中的任何函数所访问和修改。

例如,声明一个全局字符串类型的变量:

var name string = "Go语言教程"

func main() {

fmt.Println(name)

}

5.2 局部变量

在函数内部声明的变量称为局部变量,局部变量只能在声明它们的函数内部被访问。

例如,声明一个局部整数类型的变量:

func main() {

var age int = 18

fmt.Println(age)

}

5.3 函数参数

函数参数的作用范围是函数内部,函数外部无法访问函数内部的参数。

例如,定义一个函数,计算两个整数的和:

func sum(a int, b int) {

fmt.Println(a + b)

}

func main() {

sum(1, 2)

}

6. 变量的生命周期

在Go语言中,变量的生命周期是指变量在程序运行时的有效时间,它取决于变量的作用域和变量所在的位置。

6.1 全局变量的生命周期

全局变量的生命周期与程序的运行周期相同,在程序启动时创建,在程序结束时销毁。

例如:

var name string = "Go语言教程"

func main() {

fmt.Println(name)

}

6.2 局部变量的生命周期

在函数内部声明的局部变量的生命周期与函数的执行周期相同,当函数执行结束时,局部变量的内存空间被释放。

例如:

func main() {

var age int = 18

fmt.Println(age)

}

7. 变量的内存地址

在Go语言中,每个变量都有一个地址,可以使用&运算符获取变量的地址。

例如:

var name string = "Go语言教程"

fmt.Println(&name) // 输出变量 name 的地址

输出:0xc0000aa000

8. 值类型和引用类型

在Go语言中,变量可以分为值类型和引用类型。

8.1 值类型

当一个变量被复制时,它的值会被完整地复制一份,这种变量叫做值类型的变量。

例如,整数、浮点数、布尔类型、字符类型和数组类型都属于值类型。

例如,声明两个整数类型的变量并完成赋值,这两个变量是独立的:

a := 1

b := a

a = 2

fmt.Println(a) // 输出 2

fmt.Println(b) // 输出 1

8.2 引用类型

当变量被赋值为另外一个变量的地址时,它们使用同一块内存,这种变量叫做引用类型的变量。

例如,切片、映射、通道和结构体类型等都属于引用类型。

例如,声明一个切片类型的变量,然后将该变量赋值给另一个变量,这两个变量使用同一块内存:

a := []int{1, 2, 3}

b := a

a[0] = 100

fmt.Println(a) // 输出 [100 2 3]

fmt.Println(b) // 输出 [100 2 3]

9. 结语

本文总结了Go语言中的变量、常量、作用域、生命周期、地址和类型等知识点,对于初学者来说是一个很好的学习资料。

后端开发标签