首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-03-05 12:42
  • 4351
  • 8467
blog.csdn.net

写在前面的话

为了能让读者更好地理解概念,本系列课程都是使用一边讲解一边实践的方式来加深读者的理解,做到看得懂也能从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
    
    • 1
    • 2
    • 3
    • 4
    • 5

在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)
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
运行
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
  • 1
  • 2
  • 3
  • 4
  • 5

上一节课我们已经介绍过了包和函数,如还不清楚这两个概念的,请阅读第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要定义多个变量,但是他们的类型不一样,就可以采用pval4和pval5这种定义方式,变量pval6和pval7在定义时还设置了初始值

    var (
        pval4 int
        pval5 string
    )
    var (
        pval6 int = 6
        pval7 string = ""
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  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)
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
运行
jagitch@34c4dd4d4a3e:go-var1$ go run main.go
pval1=1,pval2=2, pval3=3
lval1=11,lval2=12, lval3=13, lval4=23
  • 1
  • 2
  • 3
代码解析:
  1. 定义变量的时候可以给变量设置一个初始值,如var pval1 int = 1为变量pval1设置初始值为1,var pval2, pval3 int = 2, 3同时为2个变量设置初始值,pval2,pval3的初始值分别为2和3

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

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

  4. 接下来我们来认识一个新语句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行输出将会在同一行上。

  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)
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
运行
jagitch@34c4dd4d4a3e:go-var1$ go run main.go
lval1=111, lval2=12, lval3=113
  • 1
  • 2
代码解析
  1. 可以使用:=定义变量同时给它设置初始值,且不需要指定变量的数据类型(变量的类型是Go编译器根据右值推导出来的),非常简洁,这也是小编喜欢Go的原因之一,简洁却不失性能。这种方式叫做变量的简短声明,如main函数中的lval1, lval2 := 11, 12声明了2个变量lval1和lval2

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

    在这里插入图片描述

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

    在这里插入图片描述

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

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

上一篇

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

推荐阅读

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

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

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

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

文章知识点与官方知识档案匹配,可进一步学习相关知识
Go技能树初窥门径go变量和常量4816 人正在系统学习中
注:本文转载自blog.csdn.net的gopyer的文章"https://blog.csdn.net/fuxily/article/details/139362290"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top