Hello,各位小伙伴大家好,我是小栈君,最近一段时间我们将继续分享关于go语言基础系列,当然后期小栈君已经在筹划关于java、Python,数据分析、人工智能和大数据等相关系列文章。希望能和大家一起学习进步,相互提高。

好了,话不多说,我们开始今天的分享,今天分享的主题是关于go语言系列中的延迟调用和作用域相关的知识。

延迟调用defer

在go语言中关键字 defer ⽤于延迟一个函数或者方法(或者当前所创建的匿名函数)的执行。注意,defer语句只能出现在函数或方法的内部。所以我们常用作关闭流处理或则需要进行延期处理的操作。

func main() {
defer fmt.Println("小栈君在测试defer") //main结束前调用
fmt.Println("this is a test") /*
运行结果:
this is a test
小栈君在测试defer
*/
}

defer语句经常被用于处理成对的操作,如打开、关闭、连接、断开连接、加锁、释放锁。通过defer机制,不论函数逻辑多复杂,都能保证在任何执行路径下,资源被释放。释放资源的defer应该直接跟在请求资源的语句后。

多个defer执行顺序

如果一个函数中有多个defer语句,它们会以LIFO(后进先出)的顺序执行。哪怕函数或某个延迟调用发生错误,这些调用依旧会被执⾏。

	func test(x int) {
fmt.Println(10 / x)//x为0时,产生异常
} func main() {
defer fmt.Println("111")
defer fmt.Println("222") defer test(0) defer fmt.Println("333")
/*
运行结果:
333
222
111
panic: runtime error: integer divide by zero
*/
}

defer和匿名函数结合使用

小栈君这边直接为大家举例说明在匿名函数中使用defer 会有怎样的效果呢?

			func main() {
a, b := 10, 20
defer func(x int) { // a以值传递方式传给x
fmt.Println("defer:", x, b) // b 闭包引用
}(a) a += 10
b += 100 fmt.Printf("a = %d, b = %d\n", a, b) /*
运行结果:
a = 20, b = 120
defer: 10 120
*/
}

所以在运行结果上看,使用了defer会先进行传值,然后是最后才会计算出来

获取命令行参数

	package main
import (
"fmt"
"os"
)
func main() {
// IT小栈君
agers := os.Args
// 如果用户输入不正确或个数不对 则提醒
if agers != nil && len(agers) < 2 {
fmt.Println("小栈君提醒你,您输入的位数不正确~")
return
}
fmt.Println("小栈君告诉你实际传参==》", agers)
}

运行结果如下:

作用域

作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。就好比是你在行车过程中所能够行使的范围一样。

局部变量

在函数体内声明的变量、参数和返回值变量就是局部变量,它们的作用域只在函数体内:

func test(a, b int) {
var c int
a, b, c = 1, 2, 3
fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
} func main() {
//a, b, c = 1, 2, 3 //err, a, b, c不属于此作用域
{
var i int
i = 10
fmt.Printf("i = %d\n", i)
} //i = 20 //err, i不属于此作用域 if a := 3; a == 3 {
fmt.Println("a = ", a)
}
//a = 4 //err,a只能if内部使用
}

全局变量

在函数体外声明的变量称之为全局变量,全局变量可以在整个包甚至外部包(被导出后)使用。

var a int //全局变量的声明

func test() {
fmt.Printf("test a = %d\n", a)
} func main() {
a = 10
fmt.Printf("main a = %d\n", a) //main a = 10 test() //test a = 10
}

不同作用域同名变量

在不同作用域可以声明同名的变量,其访问原则为:在同一个作用域内,就近原则访问最近的变量,如果此作用域没有此变量声明,则访问全局变量,如果全局变量也没有,则报错。

var a int //全局变量的声明

func test01(a float32) {
fmt.Printf("a type = %T\n", a) //a type = float32
} func main() {
fmt.Printf("a type = %T\n", a) //a type = int, 说明使用全局变量的a var a uint8 //局部变量声明 {
var a float64 //局部变量声明
fmt.Printf("a type = %T\n", a) //a type = float64
} fmt.Printf("a type = %T\n", a) //a type = uint8 test01(3.14)
test02()
} func test02() {
fmt.Printf("a type = %T\n", a) //a type = int
}

今天的分享就到这里就结束啦,如果你喜欢我的分享,麻烦你点击再看,分享或留言,我是小栈君,我们下期见,拜了个拜~

本文由博客一文多发平台 OpenWrite 发布!

Go语言系列开发之延迟调用和作用域的更多相关文章

  1. go语言基础之defer延迟调用

    1.defer作用 关键字 defer ⽤于延迟一个函数或者方法(或者当前所创建的匿名函数)的执行.注意,defer语句只能出现在函数或方法的内部. 运行场景: defer语句经常被用于处理成对的操作 ...

  2. Go语言系列:(1)在VsCode中配置Go的开发环境

    一.为什么选VSCode 这个系列的初宗是带领公司的PHPer转Go,在正式写这篇博文前,咱们先说说Go有哪些主流的IDE 1.GoLand(收费) JetBrains出品必属精品,除了贵没有其它缺点 ...

  3. 高质量,高效率的多国语言软件开发(Web/PC/Mobile),使用接口约束/调用不同语言资源

    偶然间翻出了几年前写的一个小程序,把当时的资料整理整理分享一下. 当时为了给自己的软件实现多国语言功能,而开发的辅助工具:SE String Resource. 这是当时基于自己另一款 IDE 软件抽 ...

  4. 【Go语言系列】1.3、GO语言简介:Go语言开发的知名项目

    下面列举的是原生使用Go语言进行开发的部分项目.1.DockerDocker 是一种操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器.Docker 可以在一台物理服务器 ...

  5. .Net语言 APP开发平台——Smobiler学习日志:实现在手机上调用摄像头进行扫描

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的&qu ...

  6. .Net语言 APP开发平台——Smobiler学习日志:如何在手机中调用邮件发送接口

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 二.发送邮件代码 VB: Pr ...

  7. .Net语言 APP开发平台——Smobiler学习日志:如何调用API进行短信发送

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 二.发送短信代码 VB: Pr ...

  8. go语言系列-从零到数据类型的基本介绍

    视频资源:b站UP主v若水若水的尚硅谷go视频 不动笔墨不读书 ,虽然我有全套视频和笔记 还是自己动点笔墨 因为在19年下半年大致学过go语言 所以这么计划:一个星期拿下基础 一个星期拿下框架 两个星 ...

  9. .Net语言 APP开发平台——Smobiler学习日志:如何快速在手机上实现ContextMenu

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的&qu ...

随机推荐

  1. NIO入门-----01

    package com.sico.pck01_nio; import java.nio.ByteBuffer; import org.junit.Test; /**  * @author Sico   ...

  2. 47 (OC)* OC反射机制

    Objective-C反射机制:是类似于Java的反射机制,这种动态机制可以让oc语言更加的灵活.这句话是对oc反射机制的初步认识,不过具体的怎么类似于java机制,怎么让oc更加的灵活,还得看下面的 ...

  3. 最新2019Pycharm破解教程,附激活码!

    本教程仅用作个人学习,请勿用于商业获利,造成后果自负!!! Pycharm安装 在这插一个小话题哈,Pycharm只是一个编译器,并不能代替Python,如果要使用Python,还是需要安装Pytho ...

  4. java数据结构——栈(Stack)

    学习数据结构与算法是枯燥的,但只有坚持不懈的积累,才会有硕果累累的明天. /** * 继续学习Java数据结构 ————栈 * 栈的实现其实还是使用数组,只不过我们不能直接访问数组下标,而是通过一个指 ...

  5. Fliptile POJ-3279 DFS

    题目链接:Fliptile 题目大意 有一个01矩阵,每一次翻转(0->1或者1->0)一个元素,就会把与他相邻的四个元素也一起翻转.求翻转哪些元素能用最少的步骤,把矩阵变成0矩阵. 思路 ...

  6. Spring 梳理 - WebMvcConfigurerAdapter详解

    参考:https://blog.csdn.net/weixin_43453386/article/details/83623242

  7. SpringCloudEureka入门

    说明 SpringBoot版本 2.1.7.RELEASE SpringCloud版本 Greenwich.SR2 创建eureka server工程 加入pom依赖 <dependencies ...

  8. idea Error: java: OutOfMemoryError: insufficient memory处理

    在更新项目代码或者运行项目时报错 OutOfMemoryError: insufficient memory,解决方式如下: 方式1: 点击file,选择Invalidate Caches 进行清理一 ...

  9. windows 安装gitbook并使用gitbook editor可视化工具

    GitBook是一个基于 Node.js 的命令行工具,可使用 Github/Git 和 Markdown 来制作精美的电子书. 一.官网下载nodejs直接安装 传送门,安装完成后如下: 可以看到n ...

  10. 纯 CSS 实现幻灯片播放

    介绍:   今日看到一道面试题,关于 使用纯CSS,不利用js, 写一个简单的幻灯效果页面.于是做了一个小demo,建议使用chrome,IE11查看~~ 主要思想: 利用 CSS3的 伪类选择器 : ...