Golang中的一些关键字(defer、:=、go func())

news/2025/1/31 9:08:35/

作者:非妃是公主
专栏:《Golang》
博客主页:https://blog.csdn.net/myf_666
个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩
在这里插入图片描述

文章目录

  • defer
  • var与 := 的区别
    • var
    • :=
    • 二者区别
  • go func

defer

defer表示延迟调用,在程序返回前进行调用。

如果程序中存在多个defer,调用顺序类似于栈,后定义的先执行,先定义的后执行。


var与 := 的区别

var

  1. 声明变量,如下:
// 定义一个名称为“variableName”,类型为"type"的变量
// var variableName type
var number int
  1. 定义并初始化变量
// 初始化“variableName”的变量为“value”值,类型是“type”
// var variableName type = value
var number int = 10
  1. 同时定义并初始化多个变量——平行赋值
/* 定义三个类型都是"type"的变量,并且分别初始化为相应的值vname1为v1,vname2为v2,vname3为v3*/
// var vname1, vname2, vname3 type = v1, v2, v3
var number1, number2, number3 int = 1, 2, 3

:=

相比于var,:=的有点是,可以自动推导变量类型,如下:

/* 
定义三个变量,它们分别初始化为相应的值    
vname1为v1,vname2为v2,vname3为v3    
编译器会根据初始化的值自动推导出相应的类型
*/
// vname1, vname2, vname3 := v1, v2, v3
number1, number2, number3 := 1, 2, 3

二者区别

:=这个符号直接取代了vartype,这种形式叫做简短声明。但是,值得注意的是,它只能用在函数内部;在函数外部使用则会无法编译通过,所以一般用var方式来定义全局变量。

换句话说,“:=”只能在声明“局部变量”的时候使用,而“var”没有这个限制。1


go func

go关键字,相当于新开一个线程,在go语言中叫做goroutine。由于是新开一个线程,所以它的运行与主线程是并行的。具体可以看如下的示例程序:

package mainimport ("fmt""time"
)func main() {go spinner(100 * time.Millisecond)const n = 45fibN := fib(n) // slowfmt.Printf("\rFibonacci(%d) = %d\n", n, fibN)
}func spinner(delay time.Duration) {for {for _, r := range `-\|/` {fmt.Printf("\r%c", r)time.Sleep(delay)}}
}func fib(x int) int {if x < 2 {return x}return fib(x-1) + fib(x-2)
}

这是一个计算斐波那契的程序,计算第45项的值。由于采用递归算法进行实现,这需要耗费一定的时间,我们通过spinner函数,来新开辟1个线程(或者称为goroutine)来动态的显示程序的运行状态。

程序运行结果如下:
在这里插入图片描述

最终输出结果如下:

在这里插入图片描述

值得注意的是,语句fmt.Printf("\r%c", r)中的"\r%c"作用是:字符串格式化语句,在行首不断输出字符,由于是在行首,所以不断覆盖,不会向后输出,产生了原地旋转小车轮的动态效果。

其中,"\n"是换行符,"\r"是回车符(返回行首),由于我们轮流输出"-\|/",因此产生动态的效果。关于"\r"的详细介绍可以参考:https://blog.csdn.net/myf_666/article/details/128731608


  1. https://www.php.cn/be/go/439542.html ↩︎


http://www.ppmy.cn/news/51871.html

相关文章

字节超全学习流程图流出,100天涨薪10k,从功能测试到自动化测试

今年年初&#xff0c;由于经济压力让我下定决心进阶自动化测试&#xff0c;已经24的我做了3年功能测试&#xff0c;坐标广州薪资定格在8k&#xff0c;可能是生活过的太安逸&#xff0c;觉得8000的工资也够了。 但是生活总是多变的&#xff0c;女朋友的突然怀孕&#xff0c;让我…

SpringBoot配置文件

什么是配置文件 如下图&#xff1a; SpringBoot项目中会有一个自带的配置文件&#xff0c;它是properties后缀的。 配置文件的作用 配置文件是用来配置项目中的一些重要数据的。 如&#xff1a;数据库连接信息、项目的启动端口、日志等等。 如果没有这些信息&#xff0c;S…

操作系统之调度

目录 什么是调度 进程调度的时机、切换、过程与方式 调度器/调度程序 调度算法 先来先服务算法 短作业优先算法 高响应比优先算法 时间片轮转算法 优先级调度算法 多级反馈队列调度算法 什么是调度 调度的三个层次 高级调度 中级调度 低级调度 总结如下&#xff1a; …

‘gulp‘ 不是内部或外部命令,也不是可运行的程序

出现问题&#xff1a; D:\git\renwey-web-mobile>gulp default gulp 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 两种原因 原因一&#xff1a;环境变量没有设置 原因二&#xff1a;没有安装全局的gulp&#xff0c;只安装了本地gulp&#xff0c;…

博途1200/1500PLC工艺PID编程应用(SCL语言)

博途工艺PID的详细解读可以查看下面的博客文章,这里不再赘述 博途PLC 1200/1500PLC 工艺对象PID PID_Compact详细解读_RXXW_Dor的博客-CSDN博客这篇博文我们详细解读博途PLC自带的PID功能块PID_Compact,大部分工业闭环调节过程,我们采用系统自带的PID功能块基本都能胜任,一…

Matplotlib 安装

Matplotlib 安装 本章节&#xff0c;我们使用 pip 工具来安装 Matplotlib 库&#xff0c;如果还未安装该工具&#xff0c;可以参考python 怎么使用pip进行包管理。 安装 matplotlib 库&#xff1a; pip install matplotlib 安装完成后&#xff0c;我们就可以通过 import 来…

汇编小程序解析--3D立方体旋转

汇编小程序解析–3D立方体旋转&#xff0c;源代码如下&#xff0c;是vulture大神于1995年写的&#xff0c;我到现在才基本看懂。 ;本程序由国外的Vulture大哥编写&#xff0c;并公布了源码&#xff0c;这个是他95年的一个作品&#xff0c;可以说是在当时是非常成功的&#xff…

计算机专业毕业生求职选择及思考(干货满满)

这个专栏主要是关于应届生求职工作相关的文章&#xff0c;提供一些建议和思考后续持续更新&#xff01; 后面章节持续更新 计算机专业毕业生求职的整体总结和概括。 求职时间 首先注意几个求职时间节点&#xff1a; 提前批&#xff1a; 秋招提前批&#xff0c;互联网大厂招…