ljzsdut
GitHubToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeBack to homepage
Edit page

01 1 Golang中的变量声明与赋值

Golang中的变量相关总结

变量声明与赋值的几种方式

1、先声明,再赋值

	var VAR TYPE
	VAR = 类型实例

2、声明并赋值

	var VAR TYPE = 类型实例

3、类型推导

	var VAR  = 类型实例

4、短变量声明(只能在函数内部使用)

	VAR := 类型实例

示例:

基本数据类型复合数据类型备注
var num int
num = 5
var s []int
s = []int{1,2,3}
对于符合数据类型,例如slice,TYPE为"[]int"
var num int = 5var s []int = []int{1,2,3}
var num = 5var s = []int{1,2,3}
num := 5s := []int{1,2,3}

关于类型实例的说明:

1、对于基本数据类型,其类型实例就是字面量,如5是int类型的一个实例,“hello"是string类型的一个实例;

2、对于复合数据类型,其类型实例需要使用new()/make()进行实例化,也可以通过TYPE{}的方式进行类型TYPE的实例化。

3、实例化本质:根据类型TYPE分配固定大小的内存空间(类型是有大小的)。需要说明的是var VAR TYPE语句对于指针类型的VAR是没有分配内存空间的,此时其值为nil,例如slice、map、channel。

4、new()/make()/TYPE{}进行实例化,会对实例进行赋零操作。TYPE{x,y,z...}方式在进行实例化时,可以进行赋值操作。

5、new()是针对值类型变量进行内存空间的分配(并做默认初始化操作);make()是针对指针类型的变量进行内存空间的分配(并做默认初始化操作)。二者返回值都是引用类型的值。

func new(Type) *Type  // 其返回值为指向该类型的新分配的零值的指针
func make(Type, size IntegerType) Type  // make的返回类型与其参数相同,即返回一个引用类型的值,但不是指向分配内存的指针(而是分配内存中的值,即指向引用类型底层数据结构的指针)。

6、make()比new()函数多一些操作:new()函数只会进行内存分配并做默认的赋0初始化;而make()可以先为底层数组分配好内存,然后利用这个底层数组生成一个slice并赋0初始化。需要注意的是创建的这个底层数组由slice或map或channel等引用类型的对象进行维护,对程序员不可见。

另外,make只能构建slice、map和channel这3种引用类型的数据对象,因为它们都指向底层数据结构,都需要先为底层数据结构分配好内存然后创建对象并初始化。

关于*VAR、*TYPE、&VAR的区别:

*TYPE:一般用于函数参数中,是一种指针数据类型,表示存放TYPE数据的指针的类型。对应指针变量

*VAR:此时VAR是一个指针变量,*VAR是解引用,即获取指针指向的空间。

&VAR:此时VAR是一个值变量(也可以是指针变量),&VAR是取地址,即获取变量的地址。

“*VAR”,解引用的作用是获取指针指向的变量值,引用其实就是引用该变量的地址,“解”就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为“解引用”。也就是说,解引用是返回内存地址中对应的对象。

左值、右值

左值:赋值语句中,等号左边的部分。其表示一块内存空间,变量指向的内存空间。

右值:赋值语句中,等号右边的部分。其表示一个数值,存储在内存空间上的值。

func swap(a,b *int){
    *a,*b = *b,*a
}