聊聊Go的变量与常量怎么定义
来源:亿速云
时间:2023-03-17 13:57:50 218浏览 收藏
从现在开始,我们要努力学习啦!今天我给大家带来《聊聊Go的变量与常量怎么定义》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到go语言等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!
这篇文章主要介绍“聊聊Go的变量与常量怎么定义”,在日常操作中,相信很多人在聊聊Go的变量与常量怎么定义问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”聊聊Go的变量与常量怎么定义”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
1.变量交换
简单阐述一下什么是变量交换,顾名思义,就是将变量的值进行交换的一个动作
例如我们定义了两个变量a:=10
和b:=20
,那么这时候我们想要将两个变量的值进行交换的话,在Go语言中为我们提供了比较方便的方式。
案例
package main import "fmt" func main() { // 定义变量a、b,并且分别赋值10、20 a, b := 10, 20 // 第一轮输出查看结果 fmt.Println("原本a、b的结果为:", a, b) // 然后我们可以直接用 = 号来对a、b进行快速赋值,交换他们的位置 a, b = b, a // 第二轮输出查看结果 fmt.Println("新输出的a、b结果为:", a, b) }
通过以上代码我们可以看到,在=
的右侧寓意为赋值,因为在Go中支持多赋值和多声明的代码形式,所以我们只需要将要赋值的变量进行位置对换,那么新的值就被赋予了。
2.匿名变量
阐述完变量交换,那么我们就不得不提变量中的一个特殊存在,那就是匿名变量
将值赋予给匿名变量实际上也就等于将这个值给抛弃了。通常也称之为抛弃值
关键标识
利用 _ 下划线,来标识匿名变量,也是我们所说的空白标识符
案例
package main import "fmt" func main() { // 定义变量 _, a := 10, 7 // 使用匿名变量的时候10就是抛弃值 fmt.Println("输出结果:", a) }
2.1.如何理解这个匿名变量的使用场景?
可能很多人会有疑问这个匿名变量有什么意义,其实在实际的使用场景中,匿名变量的使用意义个人感觉更趋近于占位符。
假设我们用到了某个函数名字叫Dial()
的函数,这个函数会返回两个值给我们,那么我们只需要其中的一个值即可,另一个值我们用不到,但是因为是返回值,代码规则里面我们要接收,所以这时候我们就可以用匿名变量来占住另一个值的位置,代码如下。
案例
package main import ( "fmt" "net" ) func main() { //conn, err := net.Dial("tcp", "127.0.0.1:8080") //如果不想接收err的值,那么可以使用_表示,这就是匿名变量 conn, _ := net.Dial("tcp", "127.0.0.1:8080") fmt.Println(conn) }
这里的net.Dial()
函数就有两个返回值,分别为conn,err
,那么我们只需要conn
这个返回值的时候,我们就可以利用到匿名变量
来占位获取到另一个返回值,但是我们可以不需要用到这个返回值。
3.关于作用域
一个变量(常量、类型或函数)在程序中都有一定的作用范围,称之为作用域
首先Go语言的特殊性导致在编译的过程中如果出现你定义的变量、常量、函数等没有被使用的话,编译是无法通过的,所以了解作用范围是很有必要的。
了解作用域可以更好的定义你需要使用的内容,也可以解决一些编译过程中的错误。
根据定义的位置总结三种
函数内定义的变量称为局部变量
函数外定义的变量称为全局变量
函数定义中的变量称为形式参数
所谓的函数可以暂时先理解成一块代码片段,比如我们案例中常用的main()
就是函数
将内容定义在函数的{ }
内,就可以称之为定义在函数体内。
3.1.局部变量
在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,函数的参数和返回值变量都属于局部变量。
(扩展)局部变量不是一直存在的,它只在定义它的函数被调用后存在,函数调用结束后这个局部变量就会被销毁。
案例
package main import "fmt" func main() { // 定义变量,以下这些定义在main()函数中的都可以称之为局部变量 a := 10 b := 20 c := a + b // 输出局部变量 fmt.Println("输出局部变量为:", a, b, c) }
3.2.全局变量
在函数体外声明的变量称之为全局变量,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用,当然,不包含这个全局变量的源文件需要使用“import”关键字引入全局变量所在的源文件之后才能使用这个全局变量。
全局变量声明必须以 var 关键字开头,如果想要在外部包中使用(也就是想要被别的包进行import引用),那么全局变量的首字母必须大写。
案例
package main import "fmt" // 定义全局变量,必须有var关键字,并且在函数体外面 var a = 10 var b = "let's go" func main() { // 在main()函数中调用a、b fmt.Println("输出全局变量为:", a, b) demo() } func demo() { // 因为是全局使用,在要在这个源码中我们的方法都能调用到 // 因此我在sum()函数中也可以调用到b变量的值 fmt.Println("调用sum()函数输出的全局变量为:", b) }
可以看到如上案例,无论是在main()
函数中还是在我们的demo()
函数中,我们都可以得到a、b
的值进行输出
使用细节:关于全局与局部同名怎么办?
大家可能会思考一个问题,如果我有一个全局变量叫a
,同时我又在函数中也定义了一个局部变量a
,这两个变量的名字相同但是值不同,那么我们程序应该采用谁?
其实大部分时候遇到这种情况,程序当中遵循的一般都是就近原则
,也就是说很多时候我们的程序是谁离得近,就用谁。
也就说出现如上情况我们会优先先采用离得近的局部变量
案例
package main import "fmt" var a = "这是全局变量" func main() { a := "这是局部变量" fmt.Println("在main中会采用的变量是:", a) demo() } func demo() { fmt.Println("如果没有局部变量影响: ", a) }
得到的结果是:
在main中会采用的变量是: 这是局部变量
如果没有局部变量影响: 这是全局变量
注意:虽然这种情况会出现,但是还是不要出现这种让人容易产生歧义的代码,规则虽然没有不允许但是代码规范上显然这样是不对的
3.3.形式参数
在定义函数时函数名后面括号中的变量叫做形式参数(简称形参)。形式参数只在函数调用时才会生效,函数调用结束后就会被销毁,在函数未被调用时,函数的形参并不占用实际的存储单元,也没有实际值。
形式参数某种意义上也是一个被声明的局部变量,所以我们在定义局部变量的时候不要出现局部变量与形式参数重名的情况为好。
案例
package main import "fmt" // 定义了全局变量 var a = "这是全局变量" func main() { // 这里是局部变量 a := "这是main的局部变量a" b := "这是main的局部变量b" fmt.Println("输出变量的值为: ", a, b) // 在调用test()函数的时候传递局部变量a、b的值 test(a, b) } // 在函数中定义形参a、b,那么当test()函数被调用的时候 // 形参就可以直接被当作局部变量来使用,值则是由调用者的传递内容来决定的 func test(a, b string) { // 输出结果 fmt.Println("这是由main传过来的内容:", a, b) }
得到的输出结果为:
输出变量的值为: 这是main的局部变量a 这是main的局部变量b
这是由main传过来的内容: 这是main的局部变量a 这是main的局部变量b
通过上述案例,让我们对 局部变量 、 全局变量 、 形式参数 有一个了解,并且分清楚他们之间的区别和使用
4.关于常量
在我们开始介绍代码中的常量的时候,我们要先阐述一下什么叫做常量?
实际上所谓的常量就是一个不会改变的值,用来存储一些我们自己事先规定好、不会改变的值
4.1.常量的使用
Go语言中的常量使用关键字const
定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。
由于编译时的限制,定义常量的表达式必须为能被编译器求值的常量表达式
语法
// 注意了 []表示 数据类型 可写,可不写 const 常量名 [数据类型] = 值
从之前的变量声明中我们可以知道,其实Go语言很多时候想要简化一些批量性的动作,因此在定义常量的时候也可以采用批量式的定义。
批量定义的语法
const ( 常量名1 = 值1 常量名2 = 值2 ... )
所有常量的运算都可以在编译期完成,这样不仅可以减少运行时的工作,也方便其他代码的编译优化,当操作数是常量时,一些运行时的错误也可以在编译时被发现,例如整数除零、字符串索引越界、任何导致无效浮点数的操作等。
案例
// 单个定义常量 const pi= 3.14159 // 批量定义常量 const ( e = 2.7182818 pi = 3.1415926 )
4.2.常量使用的细节
其实在使用常量的过程中,我们除了采用批量定义的方式来定义常量,我们还可以用另一种方式在批量定义常量的同时,简化常量初始化(赋值)的过程。
简单来说,假设我要定义a、b、c、d
四个常量。a、b的值都定义为10,c、d的值都定义为20,那么我们在初始化的时候就可以进行一些简化操作。
案例解析
package main import "fmt" const ( a = 10 b c = 20 d ) func main() { fmt.Println("输出定义的常量:", a, b, c, d) }
最终得到的输出结果为:
输出定义的常量: 10 10 20 20
4.3.iota常量生成器
常量声明可以使用 iota 常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。
简单来说呢,就是有点类似于计数器的存在,在定义第一个常量的时候会被归置为0,然后依此累加1
需求
我们从需求出发可能更好理解这个iota
假设我们要定义常量为周一到周天,那么周一为0,依次类推周天为6。
案例解析
package main import "fmt" // 定义周一到周天 const ( Monday = iota Tuesday Wednesday Thursday Friday Saturday Sunday //6 ) func main() { fmt.Println("输出日期的值为:", Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday) }
输出的结果为:
输出日期的值为: 0 1 2 3 4 5 6
当然我们知道iota
的初始值默认归0,但是只要你在第一步对iota进行运算操作,比如Monday = iota+1
,那么你可以发现在改变初始值的情况下,后续的值也会陆续发生改变,可以动手试试哦!
到此,关于“聊聊Go的变量与常量怎么定义”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注golang学习网,小编会继续努力为大家带来更多实用的文章!
文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《聊聊Go的变量与常量怎么定义》文章吧,也可关注golang学习网公众号了解相关技术文章。
-
185 收藏
-
460 收藏
-
430 收藏
-
450 收藏
-
320 收藏
-
202 收藏
-
199 收藏
-
145 收藏
-
168 收藏
-
165 收藏
-
473 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 重要的鸭子
- 这篇文章内容太及时了,太详细了,赞 👍👍,mark,关注作者了!希望作者能多写Golang相关的文章。
- 2023-03-20 12:07:36
-
- 大方的火龙果
- 真优秀,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢大佬分享技术文章!
- 2023-03-18 16:54:38
-
- 无限的小鸭子
- 细节满满,已收藏,感谢up主的这篇文章,我会继续支持!
- 2023-03-18 13:02:46
-
- 冷傲的店员
- 这篇文章太及时了,好细啊,受益颇多,mark,关注作者了!希望作者能多写Golang相关的文章。
- 2023-03-18 11:41:18
-
- 舒适的芹菜
- 这篇技术文章太及时了,楼主加油!
- 2023-03-17 20:56:11