既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上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
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
输出变量的值为: 这是main的局部变量a 这是main的局部变量b
这是由main传过来的内容: 这是main的局部变量a 这是main的局部变量b
[外链图片转存中…(img-rgxq6Kgc-1715821032611)]
[外链图片转存中…(img-CthnBrOh-1715821032611)]
[外链图片转存中…(img-fLyoiz4D-1715821032612)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新