函数

package main

import "fmt"

// 函数:一段代码的封装

func f1(){
fmt.Println("Hello 中国!")
} func f2(name string) {
fmt.Println("Hello", name)
} // 带参数和返回值的函数
func f3(x int, y int) int {
sum := x + y
return sum
} // 参数类型简写
func f4(x, y int) int {
return x + y
} // 可变参数
func f5(title string, y ...int) int {
fmt.Println(y) // y是一个int类型的切片
return 1
} // 命名返回值
func f6(x, y int) (sum int) {
sum = x + y // 如果使用命名的返回值,那么在函数中可以直接使用返回值变量
return // 如果使用命名的返回值 return 后面可以省略返回值变量
} // Go语言中支持多个返回值
func f7(x, y int) (sum, sub int) {
sum = x + y
sub = x - y
return
} func main () {
f1()
f2("理想")
f2("梦想")
f3(100, 200) // 调用函数
fmt.Println(f3(100, 200))
ret := f3(300, 400)
fmt.Println(ret) f5("太阳", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// 在一个命名的函数中不能够再声明命名函数
// func f8() { // } }

defer语句

defer语句会将其后面跟随的语句进行延迟处理

在defer归属的函数即将返回时,将延迟处理的语句按defer定义的逆序进行执行

先被defer的语句最后被执行,最后被defer的语句,最先被执行

package main

import "fmt"

// defer

// defer多用于函数结束之前释放资源(文件句柄、数据库连接、socket连接)
func deferDemo(){
fmt.Println("start")
defer fmt.Println("hello") // defer把它后面的语句延迟到函数即将返回的时候再执行
defer fmt.Println("apple") // 一个函数中可以有多个defer语句
defer fmt.Println("banana") // 多个defer语句安装先进后出(后进先出)的顺序延迟执行
fmt.Println("end")
} func main(){
deferDemo()
}

defer执行时机

return语句在底层并不是原子操作,它分为给返回值赋值和RET指令两步

defer语句执行的时机在返回值赋值操作后,RET指令执行前

package main

import "fmt"

// Go语言中函数的return不是原子操作,在底层分为两步来执行
// 第一步:返回值赋值
// defer
// 第二版:真正的RET返回
// 函数中如果存在defer,那么defer执行的时机是在第一步和第二步之间 func f1() int {
x := 5
defer func() {
x++ // 修改的是x不是返回值
}()
return x
} func f2() (x int) {
defer func() {
x++
}()
return 5 // 返回值=x
} func f3() (y int) {
x := 5
defer func() {
x++ // 修改的是x
}()
return x // 返回值=y=x=5
}
func f4() (x int) {
defer func(x int) {
x++ // 改变的是函数中的副本
}(x)
return 5 // 返回值=x=5
}
func main() {
fmt.Println(f1())
fmt.Println(f2())
fmt.Println(f3())
fmt.Println(f4())
}

Go语言学习——函数二 defer语句的更多相关文章

  1. Go语言学习笔记二: 变量

    Go语言学习笔记二: 变量 今天又学了一招如何查看go的版本的命令:go version.另外上一个笔记中的代码还可以使用go run hello.go来运行,只是这种方式不会生成exe文件. 定义变 ...

  2. go语言之goto语句和函数和defer语句

    1.goto关键字 import "fmt" func main() { for i := 0;i <11;i++{ if i == 2{ //关键字,goto跳转到某个位置 ...

  3. go语言学习-函数

    函数声明 函数声明包括函数名,形参列表,返回值列表(可选),函数体组成 func test(parameters) (returns) { // ... } 其中 parameters 就是函数的形参 ...

  4. GO语言学习(二)Windows 平台下 LiteIDE 的安装和使用

    1. 安装 Go 语言并设置环境变量 参考GO语言学习(一) 2. MinGW 的下载和安装 Windows 下的 Go 调试还需要安装 MinGW. 2.1 下载安装工具的安装 最新版本下载安装工具 ...

  5. [C语言学习笔记二] extern 函数的用法

    extern 用来定义一个或多个变量.其后跟数据类型名和初始值.例如: extern int a =10 它与 int,long long int,double,char的本质区别,在于 extern ...

  6. C语言学习总结(二) 运算流程

    第三章.基本运算 (运算符.算数运算符.关系运算符.逻辑运算符.三目运算符.ASXLL码) 一.什么是运算符? 概念:是编译程序执行特定的算术或逻辑操作的符号: 分类:算术运算符. 关系运算符.逻辑运 ...

  7. 【原创】go语言学习(二)数据类型、变量量、常量量

    目录 1.标识符.关键字2. 变量量和常量量3. 数据类型4. Go程序基本结构 标识符.关键字 1.标识符是⽤用来表示Go中的变量量名或者函数名,以字⺟母或_开头.后⾯面跟着字⺟母 ._或数字2. ...

  8. C语言学习笔记二

    第二章 数组 一,定义: 数组是有序数据的结合,同一数据类型 整型数组     int arr[10]={0,1,2,4,5,6,7,8,9}; 字符数组     char str[6]={'h',' ...

  9. 【GO】GO语言学习笔记二

    基本类型: 布尔型:boolean 整型:int8,byte,int16,int,uint,uintptr等 浮点型:float32,float64 复数类型:complex64,complex128 ...

随机推荐

  1. spring-boot-learning- Elasticsearch

    索引==数据库 类型==表 文档==表里面的记录 属性==表里面的列 使用RestFul风格elasticSearch进行操作 添加一个索引为megacorp,类型为employee,--id为1的文 ...

  2. vue钩子函数的妙用之“created()和activated()”

    一.created() 在创建vue对象时,当html渲染之前就触发: 但是注意,全局vue.js不强制刷新或者重启时只创建一次, 也就是说,created()只会触发一次: 二.activated( ...

  3. BMZCTF 2020祥云杯到点了

    2020祥云杯到点了 下载附件得到三个word文档,我们打开第一个文档然后将隐藏文字显示出来 得到提示 我们查看属性应该就是日期了我们先把他记录下来 然后打开第二个文档 输入刚刚的密码 在第二个wor ...

  4. 用纯CSS美化radio和checkbox

    Radio和checkbox需要美化吗?答案是必须的,因为设计风格一直都会变化,原生的样式百年不变肯定满足不了需求. 先看看纯CSS美化过后的radio和checkbox效果:查看. 项目地址:mag ...

  5. CSS简单样式练习(五)

    运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...

  6. C语言-操作符与表达式

    C语言入门之操作符与表达式 前言 本篇文章主要包括各种操作符的介绍与表达式求值,欢迎各位小伙伴与我一起学习. 一.操作符 分类 算术操作符 移位操作符 位操作符 赋值操作符 单目运算符 关系操作符 逻 ...

  7. python 反序列化

    Python-反序列化函数使用 pickle.dump(obj, file) : 将对象序列化后保存到文件 pickle.load(file) : 读取文件, 将文件中的序列化内容反序列化为对象 pi ...

  8. Qt QComboBox之setEditable和currentTextChanged及其源码分析

    目录 Qt QComboBox之setEditable和currentTextChanged以及其源码分析 前言 问题的出现 问题分析 currentTextChanged信号触发 源码分析 Qt Q ...

  9. 服务器jupyter连接不上主机

    首先安装jupyter pip3 install jupyter -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 然后 ...

  10. Spring相关的API-ApplicationContext

    1.ClassPathXmlApplicationContext 它是从类的根路径下加载配置文件推荐使用这种 public class UserController { public static v ...