【Go零基础系列】003:Go语言中的变量详解

写在前面的话

为了能让读者更好地理解概念,本系列课程都是使用一边讲解一边实践的方式来加深读者的理解,做到看得懂也能从0开始自己编程。所以通篇讲解都会采用提前搭建好的vscode在线开发环境来演示代码,所以讲解过程中可能会多次提到打开web版的vscode,打开开发环境等术语,读者可以参考《搭建Golang在线开发环境(随时随地码代码)》搭建好环境。如不需要该开发环境的话请忽略这些术语,专心阅读知识点就可以了。

变量的概念详解

以前在学校我们就学习过数学中的函数,函数的定义就涉及到了变量,函数的完整定义为:设在某变化过程中有两个变量x、y,如果对于x在一定范围内的每一个确定的值,y都有唯一确定的值与它对应,那么就称y是x的函数,x叫做自变量。

在编程世界中,也有变量的概念,其实可以类比数学中的变量x去理解,x是一个变量,它的值是可以变化的,你给它什么值它就是什么值。变量就像一个箱子,它里面可以装各种数据,你把1装进去这个变量的值就是1,你把"我喜欢你"装进去,它的值就是"我喜欢你"

Go语言是一种静态类型的语言,静态的意思是说Go语言中的变量存储的数据的类型是静态的,是不能动态变化的,例如你定义了一个存放整数类型的数据的变量,你就不能再往里面存其他类型的数据了(如"我喜欢你"等文本类型的数据),因此Go语言中有很多种数据类型,在定义变量的时候,要给变量指定它能存放什么类型的数据。

创建项目

  1. 浏览器中打开vscode开发环境http://127.0.0.1:8080/?folder=/home/coder/workspace

  2. 打开终端,创建项目用于演示本文实例

    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程序》

代码解析
  1. 使用var是variable的缩写,它是Go语言中的关键字,作用是定义变量

  2. var后面是变量的名字,例如var pval1 int定义的变量的名字是pval1

  3. 变量名后面是变量的类型,例如var pval1 int定义的变量的类型是int,说明这个变量只能存放整数类型的值

  4. 变量的名字是Go语言中的一种标识符,标识符只能使用字符、下划线和数字组成,并且不能以数字开头,也不能和Go语言中的所有的关键字同名。例如上述代码中定义的pval1 pval2 pval3等就是正确的标识符,3d 5name $apple就是错误的标识符,不能作为变量名

  5. int表示变量的数据类型是整数型,不能是小数,也不能是字符串(文本数据)

  6. 一个var可以定义一个变量,也可能同时定义多个变量,多个变量使用逗号分隔,并且他们的类型必须一致,如var pval2, pval3 int

  7. 如果var要定义多个变量,但是他们的类型不一样,就可以采用pval4pval5这种定义方式,变量pval6pval7在定义时还设置了初始值

    var (
        pval4 int
        pval5 string
    )
    var (
        pval6 int = 6
        pval7 string = ""
    )
    
  8. Go语言中的变量定义后,就可以直接使用了(使用的意思是给变量设置值和获取变量的值等操作),而不像某些编程语言中必须初始化后才能使用。

  9. 如果定义变量时没有给变量定义初始值,那么变量的值就是变量类型的零值(int类型的零值是0、字符串类型的零值是""、布尔类型的零值是false),从运行结果中可以看到,定义的6个变量的值都为0

  10. 从源码中我们可以发现,变量pval1,pval2,pval3定义在函数main的外面,这些变量称为包变量,它属于整个main包,而lval1, lval2, lval3定义在main函数里面,他们被称为局部变量

  11. 包变量可以在包中任何地方使用,它的作用范围是整个包,而局部变量只能在它所属的函数内部使用,例如我们不能在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
代码解析:
  1. 定义变量的时候可以给变量设置一个初始值,如var pval1 int = 1为变量pval1设置初始值为1,var pval2, pval3 int = 2, 3同时为2个变量设置初始值,pval2,pval3的初始值分别为23

  2. 我们也可以在变量定义之后使用赋值语句给变量赋值,赋值语句就是包含一个=号,左边是一个变量名,右边是值或变量名。如lval3 = 13给变量lval3的值设置为13lval1, lval2 = 11, 12为多个变量赋值,lval1, lval2的值分别设置为1112

  3. 如果我们要获取变量的值,直接使用变量名就可以,例如源码中的var lval4 int = lval1 + lval2 定义变量lval4时,使用变量lval1lval2的值作为它的初始值,lval1 + lval2在Go语言中成为表达式,可以理解成数学中的算式,lval1的值是11lval2的值是12,因此lval4的值是23,与运行结果一致。

  4. 接下来我们来认识一个新语句fmt.Printf("pval1=%d,pval2=%d, pval3=%d\n", pval1, pval2, pval3), 这是一个函数调用语句,fmt是包名,我们的项目中是没有这个包的,它是Go语言库中的一个包,为了使用它,我们需要使用import "fmt"语句将它导入到我们的包中,这样我们的包才能使用它。Printffmt包中的一个函数,它不能单独使用,需要加上包名加.作为前缀才能使用它,这样做的好处是一眼就可以看出这个函数是在哪个地方。

    Printf它的功能是向标准输出打印一行文字(编程界一般都叫字符串),在函数名后面有一对括号,这表示调用这个函数去执行打印字符串的功能(由此可见,函数是一些实现一种功能的代码的集合),在括号中是传递给函数的参数,使用逗号分隔,"pval1=%d,pval2=%d, pval3=%d\n"这是第一个参数,是一个字符串,大家可以看到这个字符串中有3个%d,这是占位符,代表这里是一个十进制的数字,后面的三个参数都是整型变量,他们分别按顺序填充到那3个%d的位置中,在运行结果中,我们可以看到最终这条语句输出为:pval1=1,pval2=2, pval3=3\n代表换行符,可以看到这条语句的后面一条的输出在下一行,如脱没有这个换行符,2行输出将会在同一行上。

  5. 包变量可以在定义的时候设置初始值,但是不能在包中(函数外)为它赋值,这是不允许的,如下图的错误演示:

    在这里插入图片描述

二、使用:=符号定义变量并初始化
实例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
代码解析
  1. 可以使用:=定义变量同时给它设置初始值,且不需要指定变量的数据类型(变量的类型是Go编译器根据右值推导出来的),非常简洁,这也是小编喜欢Go的原因之一,简洁却不失性能。这种方式叫做变量的简短声明,如main函数中的lval1, lval2 := 11, 12声明了2个变量lval1lval2

  2. :=只能使用在函数内,不能在函数外使用,否则vscode会提示报错,如下图所示

    在这里插入图片描述

  3. 每次使用:=定义变量时,左侧的变量必须有一个是未定义的,否则会报变量已定义的错误。如下图所示

    在这里插入图片描述

    图中的lval1, lval3 := 111, 113 没有报错是因为之前lval3还未定义,这条语句定义一个新的变量叫做lval3lval1因为已经定义过,所以只是将它的值设置为111

  4. 在开发中定义变量使用最多的就是:=这种方式,有些人会觉得它会影响性能,这大可不必,因为这条语句在编译阶段会推导出变量的类型,编译成机器语言后与使用var定义的没有什么区别,可以放心大胆的使用。

上一篇

【Go零基础系列】002:第一个Go程序

推荐阅读

1. 搭建Golang在线开发环境(随时随地码代码)

2. Vs code调试Go程序时怎样查看CPU寄存器的值

3. 如何调试Go语言自身的源码运行Go语言自身的源码报错

4.【Git从入门到精通】系列课程03:一分钟让你成为开源的一分子/使用github托管我们的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gopyer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值