写在前面的话
为了能让读者更好地理解概念,本系列课程都是使用一边讲解一边实践的方式来加深读者的理解,做到看得懂也能从0开始自己编程。所以通篇讲解都会采用提前搭建好的vscode在线开发环境来演示代码,所以讲解过程中可能会多次提到打开web版的vscode,打开开发环境等术语,读者可以参考《搭建Golang在线开发环境(随时随地码代码)》搭建好环境。如不需要该开发环境的话请忽略这些术语,专心阅读知识点就可以了。
变量的概念详解
以前在学校我们就学习过数学中的函数,函数的定义就涉及到了变量,函数的完整定义为:设在某变化过程中有两个变量x、y,如果对于x在一定范围内的每一个确定的值,y都有唯一确定的值与它对应,那么就称y是x的函数,x叫做自变量。
在编程世界中,也有变量的概念,其实可以类比数学中的变量x去理解,x是一个变量,它的值是可以变化的,你给它什么值它就是什么值。变量就像一个箱子,它里面可以装各种数据,你把1
装进去这个变量的值就是1,你把"我喜欢你"
装进去,它的值就是"我喜欢你"
。
Go语言是一种静态类型的语言,静态的意思是说Go语言中的变量存储的数据的类型是静态的,是不能动态变化的,例如你定义了一个存放整数
类型的数据的变量,你就不能再往里面存其他类型的数据了(如"我喜欢你"
等文本类型的数据),因此Go语言中有很多种数据类型,在定义变量的时候,要给变量指定它能存放什么类型的数据。
创建项目
-
浏览器中打开vscode开发环境
http://127.0.0.1:8080/?folder=/home/coder/workspace
-
打开终端,创建项目用于演示本文实例
jagitch@34c4dd4d4a3e:workspace$ mkdir go-var1 jagitch@34c4dd4d4a3e:workspace$ cd go-var1 jagitch@34c4dd4d4a3e:go-var1$ go mod init go-var1 go: creating new go.mod: module go-var1 jagitch@34c4dd4d4a3e:go-var1$ touch main.go
在Go语言中定义变量的两种方式
由于本节课程主要介绍变量,数据类型之后再介绍,我们就使用最简单的整数类型int
来进行演示。
一、使用var
关键字定义变量
实例1:变量的定义
编写main.go,源代码如下所示:
package main
import "fmt"
var pval1 int
var pval2, pval3 int
var (
pval4 int
pval5 string
)
var (
pval6 int = 6
pval7 string = "hello ,go"
)
func main() {
var lval1, lval2 int
var lval3 int
fmt.Printf("pval1=%d,pval2=%d, pval3=%d\n", pval1, pval2, pval3)
fmt.Printf("lval1=%d,lval2=%d, lval3=%d\n", lval1, lval2, lval3)
fmt.Printf("pval4=%d,pval5=%s\n", pval4, pval5)
fmt.Printf("pval6=%d,pval7=%s\n", pval6, pval7)
}
运行
jagitch@34c4dd4d4a3e:go-var1$ go run main.go
pval1=0,pval2=0, pval3=0
lval1=0,lval2=0, lval3=0
pval4=0,pval5=
pval6=6,pval7=hello ,go
上一节课我们已经介绍过了包和函数,如还不清楚这两个概念的,请阅读第2节的内容《【Go零基础系列】002:第一个Go程序》
代码解析
-
使用
var
是variable的缩写,它是Go语言中的关键字,作用是定义变量 -
var后面是变量的名字,例如
var pval1 int
定义的变量的名字是pval1
-
变量名后面是变量的类型,例如
var pval1 int
定义的变量的类型是int
,说明这个变量只能存放整数类型的值 -
变量的名字是Go语言中的一种标识符,标识符只能使用字符、下划线和数字组成,并且不能以数字开头,也不能和Go语言中的所有的关键字同名。例如上述代码中定义的
pval1 pval2 pval3
等就是正确的标识符,3d 5name $apple
就是错误的标识符,不能作为变量名 -
int
表示变量的数据类型是整数型,不能是小数,也不能是字符串(文本数据) -
一个
var
可以定义一个变量,也可能同时定义多个变量,多个变量使用逗号分隔,并且他们的类型必须一致,如var pval2, pval3 int
-
如果
var
要定义多个变量,但是他们的类型不一样,就可以采用pval4
和pval5
这种定义方式,变量pval6
和pval7
在定义时还设置了初始值var ( pval4 int pval5 string ) var ( pval6 int = 6 pval7 string = "" )
-
Go语言中的变量定义后,就可以直接使用了(使用的意思是给变量设置值和获取变量的值等操作),而不像某些编程语言中必须初始化后才能使用。
-
如果定义变量时没有给变量定义初始值,那么变量的值就是变量类型的零值(int类型的零值是0、字符串类型的零值是
""
、布尔类型的零值是false),从运行结果中可以看到,定义的6个变量的值都为0 -
从源码中我们可以发现,变量
pval1,pval2,pval3
定义在函数main的外面,这些变量称为包变量,它属于整个main包,而lval1, lval2, lval3
定义在main函数里面,他们被称为局部变量 -
包变量可以在包中任何地方使用,它的作用范围是整个包,而局部变量只能在它所属的函数内部使用,例如我们不能在main函数外面使用
lval1, lval2, lval3
实例2:变量的赋值
编写main.go,源代码如下:
package main
import "fmt"
var pval1 int = 1
var pval2, pval3 int = 2, 3
func main() {
var lval1, lval2 int
var lval3 int
lval1, lval2 = 11, 12
lval3 = 13
var lval4 int = lval1 + lval2
fmt.Printf("pval1=%d,pval2=%d, pval3=%d\n", pval1, pval2, pval3)
fmt.Printf("lval1=%d,lval2=%d, lval3=%d, lval4=%d\n", lval1, lval2, lval3,lval4)
}
运行
jagitch@34c4dd4d4a3e:go-var1$ go run main.go
pval1=1,pval2=2, pval3=3
lval1=11,lval2=12, lval3=13, lval4=23
代码解析:
-
定义变量的时候可以给变量设置一个初始值,如
var pval1 int = 1
为变量pval1
设置初始值为1,var pval2, pval3 int = 2, 3
同时为2个变量设置初始值,pval2,pval3
的初始值分别为2
和3
-
我们也可以在变量定义之后使用赋值语句给变量赋值,赋值语句就是包含一个
=
号,左边是一个变量名,右边是值或变量名。如lval3 = 13
给变量lval3
的值设置为13
,lval1, lval2 = 11, 12
为多个变量赋值,lval1, lval2
的值分别设置为11
和12
-
如果我们要获取变量的值,直接使用变量名就可以,例如源码中的
var lval4 int = lval1 + lval2
定义变量lval4
时,使用变量lval1
和lval2
的值作为它的初始值,lval1 + lval2
在Go语言中成为表达式,可以理解成数学中的算式,lval1
的值是11
,lval2
的值是12
,因此lval4
的值是23
,与运行结果一致。 -
接下来我们来认识一个新语句
fmt.Printf("pval1=%d,pval2=%d, pval3=%d\n", pval1, pval2, pval3)
, 这是一个函数调用语句,fmt是包名,我们的项目中是没有这个包的,它是Go语言库中的一个包,为了使用它,我们需要使用import "fmt"
语句将它导入到我们的包中,这样我们的包才能使用它。Printf
是fmt
包中的一个函数,它不能单独使用,需要加上包名加.
作为前缀才能使用它,这样做的好处是一眼就可以看出这个函数是在哪个地方。Printf
它的功能是向标准输出打印一行文字(编程界一般都叫字符串),在函数名后面有一对括号,这表示调用这个函数去执行打印字符串的功能(由此可见,函数是一些实现一种功能的代码的集合),在括号中是传递给函数的参数,使用逗号分隔,"pval1=%d,pval2=%d, pval3=%d\n"
这是第一个参数,是一个字符串,大家可以看到这个字符串中有3个%d
,这是占位符,代表这里是一个十进制的数字,后面的三个参数都是整型变量,他们分别按顺序填充到那3个%d
的位置中,在运行结果中,我们可以看到最终这条语句输出为:pval1=1,pval2=2, pval3=3
,\n
代表换行符,可以看到这条语句的后面一条的输出在下一行,如脱没有这个换行符,2行输出将会在同一行上。 -
包变量可以在定义的时候设置初始值,但是不能在包中(函数外)为它赋值,这是不允许的,如下图的错误演示:
二、使用:=
符号定义变量并初始化
实例1:
编写main.go的源码如下
package main
import "fmt"
func main() {
lval1, lval2 := 11, 12
lval1, lval3 := 111, 113
fmt.Printf("lval1=%d, lval2=%d\n, lval3=%d\n", lval1, lval2, lval3)
}
运行
jagitch@34c4dd4d4a3e:go-var1$ go run main.go
lval1=111, lval2=12, lval3=113
代码解析
-
可以使用
:=
定义变量同时给它设置初始值,且不需要指定变量的数据类型(变量的类型是Go编译器根据右值推导出来的),非常简洁,这也是小编喜欢Go的原因之一,简洁却不失性能。这种方式叫做变量的简短声明,如main函数中的lval1, lval2 := 11, 12
声明了2个变量lval1
和lval2
-
:=
只能使用在函数内,不能在函数外使用,否则vscode会提示报错,如下图所示 -
每次使用
:=
定义变量时,左侧的变量必须有一个是未定义的,否则会报变量已定义的错误。如下图所示图中的
lval1, lval3 := 111, 113
没有报错是因为之前lval3
还未定义,这条语句定义一个新的变量叫做lval3
,lval1
因为已经定义过,所以只是将它的值设置为111
-
在开发中定义变量使用最多的就是
:=
这种方式,有些人会觉得它会影响性能,这大可不必,因为这条语句在编译阶段会推导出变量的类型,编译成机器语言后与使用var定义的没有什么区别,可以放心大胆的使用。