目录
一、变量
1、变量的定义
2、变量的赋值
3、变量的初始化
4、匿名变量
二、常量
1、字面常量
2、const关键字定义一个常量
3、预定义常量iota
一、变量
变量就是给一块数据存储空间的命个名,在开发中我们可以通过定义一个变量来申请一块数据存储空间,然后通过引用变量名来使用这块存储空间。
1、变量的定义
-
需要注意的是:
- 定义了但没有使用的变量,编译器会报错
-
:=
定义变量并赋值只能用在函数内部,在函数外部定义变量的话只能用老办法
- 定义方法1:Go语言定义一个和C语言有点不同,它引入了一个关键字var(variable的缩写)来表明我们要定义一个变量,紧跟着是变量名,然后才是变量的类型,和C的反了一下。如:
(清单1.1)
var v1 bool
var v2 int
var v3 float64
var v4 string
- 定义方法2:当然为了避免我们一直重复地写var关键字,我们可以把多个变量放在一起来定义。如:
(清单1.2)
var (
v1 bool
v2 int
v3 float64
v4 string
)
2、变量的赋值
- 普通赋值:当我们已经定义好一个变量后,就可以对它进行赋值。如:
(清单1.3)
var (
v1 bool
v4 string
)
v1 = true
v4 = "你好"
- 多重赋值:Go语言有一个很好玩的地方就在于它可以给多个变量一起赋值。
例如要交换两个变量的值,在C语言中我们可能需要一个中间变量来帮忙,但是在Go语言中就不需要了。如:
(清单1.4)
var (
i int
j int
)
i = 11
j = 12
i, j = j, i // 多重赋值
3、变量的初始化
初始化和赋值是两个不同的概念,赋值是指变量在定义完之后的复制操作,如上面的。而变量的初始化是指我们在定义变量的时候,同时给变量赋一个初始值,来完成变量的初始化操作,如下。
-
最原始的变量初始化方法:在变量的定义后面给变量赋值。如:
(清单1.5)
var v1 int = 11
-
不指定变量类型的初始化方法:其实在Go语言中,我们已经不再需要指定变量的类型了,编译器会在编译阶段根据变量值自动推导出变量的类型。这让Go看起来好像动态语言一样,但其实它是一门静态语言。如:
(清单1.5)
var v1 = 11 // 编译器在编译阶段会自动根据11推导出v1的类型为整型
-
最强变量初始化法:这个方法什么关键字也不需要了,直接用“冒号+等于号”
:=
就可以定义一个变量并给它赋值。我们看到前两种方法是用var定义了一个变量之后,然后再给变量赋值,为了更简洁,Go里还提供了一个非常简单的变量赋值方法,就是它引入了一个新的运算符“冒号+等于号”:=
,它代表的意思就是定义一个变量并赋值,因此“冒号”就代替了var的作用,我们也就不用再写var了
(清单1.6)
v1 := 11 // 定义一个变量v1并赋值,编译器在编译阶段会自动根据11推导出v1的类型为整型
当然了我们要注意,:=
运算符是变量定义+赋值运算符
,因此不能把它等同于赋值运算符=
,所以:=
左边的变量不能是已经定义过的,否则编译器会报错。如:
(清单1.7)
var v1 := 11
或者
var v1 int
v1 := 11
编译器都会报错。
4、匿名变量
前面我们举过例子,当函数返回多个返回值时,我们不想获取其中的某个变量,就可以用下划线_
这个匿名变量来接收返回值,这样代码更清晰、好看、不乱,没用的东西就不写嘛。如:
(清单1.8)
package main
import "fmt"
func main() {
_, firstName, _ := getName() // 使用匿名变量接收不需要的返回值
fmt.Println(firstName)
}
func getName() (lastName, firstName, nickname string) {
return "王", "二狗", "狗子"
}
二、常量
在Go语言中,常量是指编译期间就已知且不可改变的值。常量可以是布尔类型、数值类型(如整型、浮点型和复数类型)、字符串类型等。
1、字面常量
所谓字面常量,是指程序中硬编码的常量
。如:
(清单2.1)
true/false // 布尔类型的常量
11 // 整型常量
3.1415926... // 浮点型常量
P"yiyi" // 字符串常量
2、定义一个常量:使用const关键字
我们就可以使用const关键字给一些字面常量起一个比较易于理解的名字。如:
(清单2.2)
const Pi = 3.141592653589793
const zero = 0
当然,我们要知道Go语言针对所有的关键字,为了避免我们重复的书写关键字,都提供了“括号”()
的写法,const当然也不例外。如:
但是也要注意,使用const关键字定义一个常量时,等号右边必须是编译期间就已经能知道结果的值,不能是程序在运行期才能得到结果的值,否则编译会报错。如:
(清单2.3)
const v1 = 1 + 1 // 这样是可以的
const v2 = add(1, 1) // 这样是不可以的
Go语言放弃了宏定义,我们要注意宏定义和const是不一样的。
3、预定义常量
Go语言提供了一些预定义的常量:如true和false就是专门用作布尔值的,还有一个预定义常量是iota。
iota的用法是:每当它遇到const关键字的时,就会被置为0,然后在遇到下一个const关键字之前,iota每出现一次,它的值就会自动加1。如:
(清单2.4)
const ( // 遇见const关键字,iota被置为0
v1 = iota // 所以v1 = 0
v2 = iota // v2 = 1
v3 = iota // v3 = 2
)
const ( // 又遇见const关键字,iota被置为0
v4 = 2 * iota // 所以v4 = 0
v5 = 4 * iota // v5 = 4
)
iota的应用场景:通过上面对iota用法的了解,我们可以发现iota常量通常和const关键字搭配在一起使用,如实现枚举。
Go语言中没有其它语言里我们常用的enum关键字来定义枚举,所以我们需要使用iota+const来实现,如:
(清单2.5)
const (
Monday = iota // 如果两个const赋值语句的表达式一样,我们可以省略后面的复制表达式,只给第一个常量值赋值就可以了
Tuesday
Wednesday
Thursday
Friday
saturday // saturday和sunday是小写的,所以包内私有,其它枚举值包外可见
sunday
)
网友评论