01 1 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 = 5 | var s []int = []int{1,2,3} | |
| var num = 5 | var s = []int{1,2,3} | |
| num := 5 | s := []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种引用类型的数据对象,因为它们都指向底层数据结构,都需要先为底层数据结构分配好内存然后创建对象并初始化。
*TYPE:一般用于函数参数中,是一种指针数据类型,表示存放TYPE数据的指针的类型。对应指针变量
*VAR:此时VAR是一个指针变量,*VAR是解引用,即获取指针指向的空间。
&VAR:此时VAR是一个值变量(也可以是指针变量),&VAR是取地址,即获取变量的地址。
“*VAR”,解引用的作用是获取指针指向的变量值,引用其实就是引用该变量的地址,“解”就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为“解引用”。也就是说,解引用是返回内存地址中对应的对象。
左值:赋值语句中,等号左边的部分。其表示一块内存空间,变量指向的内存空间。
右值:赋值语句中,等号右边的部分。其表示一个数值,存储在内存空间上的值。
func swap(a,b *int){
*a,*b = *b,*a
}