引言:该系列笔记,是本人自学Go过程中整理的笔记,供大家参考。
Go语言的声明主要由四种:var、const、type、func,分别对应声明变量、常量、类型、函数实体对象。
变量
通常声明一个变量的一般语法如下:
var 变量名字 类型 = 表达式
其中类型和“= 表达式”都可以省略,如果省略的是类型,那么会根据表达式的赋值来判断变量所属的类型。如果省略的是“= 表达式”,那么会初始化一个定义该类型的变量,它的值为该类型的零值(zero value),比如如果是int类型,那么初始化的值为0,是string类型,那么初始化的值是"",布尔类型变量对应的零值是false,接口或引用类型(包括slice、指针、map、chan和函数)变量对应的零值是nil,数组或结构体等聚合类型对应的零值是每个元素或字段都是对应该类型的零值。
可以同时声明一组变量,也可以同时声明不同类型的变量:
var a, b, c int
var b, f, s = true, 13.3, "yes" // Boolean、float、string
一组变量也可以通过调用一个函数,由函数返回的多个值初始化:
var f, err = os.Open(file_name) // 这个函数返回一个文件和一个错误
简短声明变量
- 常用在函数内部,形式为:
名字 := 表达式
,同样的简短声明变量也支持同时声明一组变量。简短声明变量旨在提高代码可读性,比如说for循环中初始化语句部分。 - 简短声明变量是
:=
,赋值是=
,要注意区分。 - 简短声明变量左边的变量并不一定全部都是首次声明的,也有一些变量在此之前已经声明过(在同级词法域),如果此前声明过了,再次声明的效果等同于赋值。但是,简短声明要求每次声明左边的变量都必须包含一个首次声明的变量,否则无法通过编译。如果变量首次在外部词法域声明过,在内部词法域重新声明不等于赋值操作。
指针
一个指针的值是另一个变量的地址。一个指针对应变量在内存中的存储位置。并不是每一个值都会有一个内存地址,但是对于每一个变量必然有对应的内存地址。通过指针,我们可以直接读或者更新对应变量的值,而不需要知道变量的名字。
如果声明一个变量如下:
var a int
*int
是指针对应的数据类型,这里指针的数据类型是int
p := &a
是创建一个指向该整数变量的指针,指针的名字为p
*a
代表指针指向该整数变量的值
- 任何类型的指针的零值都是nil,只有当指针指向同一个值或者全是nil时指针才会相等
var x, y int
fmt.Println(&x == &x, &x == &y, &x == nil) // true, false, false
var x, y int
fmt.Println(&x == &x, &x == &y, &x == nil) // true, false, false
- 指针特别有价值的地方在于我们可以不用名字而访问一个变量
- 每次我们对一个变量取地址,或者复制指针,我们都是为原变量创建了新的别名.
new函数
将创建一个T类型的匿名变量,它的初始值为T类型的零值。然后返回变量地址,返回指针类型*T
。
p := new(int)
fmt.Println(*p) // 0
*p = 2
fmt.Println(*p) // 2
p := new(int)
fmt.Println(*p) // 0
*p = 2
fmt.Println(*p) // 2
每次调用new函数都是返回一个新的变量的地址:
p := new(int)
q := new(int)
fmt.Printlb(*p == *q) // false
下面两个函数实现的功能是一样的,new函数更像是一种语法糖
func newInt() *int {
return new(int)
}
func newInt() *int {
var dummy int
return &dummy
}
func newInt() *int {
return new(int)
}
func newInt() *int {
var dummy int
return &dummy
}
var、make、new的区别
var
、make
和new
都是Go语言中用来创建变量或对象的关键字,但它们的作用和用法是不同的。
var
关键字用于声明变量,可以用于声明任何类型的变量,包括基本类型、结构体、数组、切片、map等。例如:
var x int
var s []string
var m map[string]int
在这个例子中,我们使用var
关键字声明了一个整型变量x
,一个字符串切片s
和一个字符串到整型的映射m
。
2. `make函数用于创建切片、map和channel等引用类型的对象。例如:
s := make([]string, 10)
m := make[string]int)
ch := make(chan int)
在这个例子中,我们使用make
函数创建了一个长度为10的字符串切片s
,一个字符串到整型的映射m
和一个整型channelch
。
3. new
函数用于创建一个指向某种类型的指针,返回的是指针类型。例如:
p := new(int)
在这个例子中,我们使用new
函数创建了一个指向整型的指针p
。
总的来说,var
用于声明变量,make
用于创建引用类型的对象,new
用于创建指向某种类型的指针。需要注意的是,make
和new
都是用于动态分配内存的,而var
只是声明变量,不会分配内存。