一、变量
首先呢,变量是啥意思我就不解释了
1. 变量的声明及初始化
Go语言声明变量的方式有很多种形式,比如,可以带var关键字,可以不带;可以单个变量声明,也可以多个变量声明;
可以给初始值,也可以不给。
var age int //声明不初始化,age=0
var age int = 25 //声明并初始化,age=25
var age = 25 //自动推导类型
var age1, age2 = 25, 23 //多种变量声明
var (
name = "James" //值为James
age = 34 //值为34
salary int //值为0
)
这里有两个Go的语言特性需要注意:
--变量声明后必须要使用,声明了而不使用,编译会报错(不再赘述)
--Go会自动为没有初始化的变量赋值,赋值为其对应类型的零值
因为Go语言的特性,不允许存在没有被初始化的变量,所以如果你声明了变量却没有初始化,那么Go会自动帮你将变量
初始化为其类型的0值。
什么是0值?在Go中,每个类型都有一个默认的0值,比如,int的0值是0;bool的0值是false;string的0值是""。而自定义
类型的0值,则是将自定义类型中每个基础类型的字段初始化为其对应的0值。
2. 速记声明
Go提供了一种简洁的声明变量的方式,叫速记声明(不再需要写var),方法如下:
no := 23 //自动推导为int
name, salary := "James", 4000 //多变量的速记声明,自动推导为string和int
关于速记声明,需要注意以下几点:
--只能在函数中使用
--右边必须要给初始化的值
--左边必须有一个值是新声明的,如果左边的值全部是之前声明过的变量,则会报错
3. 匿名变量
Go还提供了另外一种写法,用 '_' 来表示变量,这种就是匿名变量,任何赋予匿名变量的值都会被丢弃。
匿名变量大多用在接收函数多个返回值时,用来接收不需要的值,或者在循环时用range的时候,用法如下:
func func1() (int, string) { //该函数有两个返回值
return 1, "Go"
}
func main() {
_, language := func1() //当只需要第二个返回值时,可以用 _ 来接收第一个返回值
fmt.Println(language) //打印结果为"Go"
}
下面说一下我之前在变量声明上碰到的一个小坑:
package main
var (
num int
)
func main() {
num := 5 // 在此处新声明了变量num,上面全局的num变量会被覆盖掉
}
-- 如果声明了全局,下面又声明了同名的变量,那么在这个作用域内,全局的变量会被覆盖掉
-- 在这个作用域外,全局变量还是能够正常使用
二、类型
Go是强类型的语言,所以不同于C++,它没有隐式的类型转换。
所以用一个类型的值赋值给另一个类型的变量是会出错的,如果有这个需要,请显示地强制转换。
var no int
var no_float float32
//no_float = no //Error: 不能给float32类型的变量用int类型赋值
no_float = float32(no) //正确,显示转换
Go的主要基础类型如下图所示:
主要基础类型及其0值如下:
var var_int int //输出为0
var var_bool bool //输出为false
var var_string string //输出为""
var var_float float64 //输出为0
fmt.Printf("[%d] [%v] [%s] [%f]\n", var_int, var_bool, var_string, var_float)
三、常量
1. 字面值常量
2. 常量声明
常量声明的语法与普通变量类似,只不过是用const关键字代替var,如下:
const var_const int = 10
const a, b, c = 3, 5, "Gogogo"
const (
size int64 = 1024
res = 0.0
)
// var_const = 5 //Error: 不允许对常量进行修改
3. iota枚举
iota是常量生成器,它可以用来初始化常量。它可以用在生成一组相似规则生成的常量,只需要在第一行写上就行了。
在一个const语句中,iota会被初始化为0,然后接下来的每一个变量逐个加1。如下:
const (
NUM_ZERO int = iota // 0
NUM_ONE // 1
NUM_TWO // 2
NUM_THREE // 3
NUM_FOUR // 4
)