GO入门——5. 函数
1 函数
Go 函数 不支持 嵌套、重载和默认参数
定义函数使用关键字 func,且左大括号不能另起一行
函数也可以作为一种类型使用
无需声明原型
不定长度变参
func A(a string,c ... int){
//不定长变参必须在最后
//此时c为一个slice
}
- 多返回值
func A() (int,int){
//返回多个int
}
- 命名返回值参数
func A() (a int,b string){
//此时a,b已经声明,直接给其赋值不需要return
//也可以不管a,b,直接return别的
}
- 匿名函数
func A(){
a:=func (){
fmt.Println("匿名函数")
}
a()
}
- 闭包
func main() {
s := []int{0, 1, 2}
c := closure(s)
fmt.Println(c()) //输出0
s[0] = 10
fmt.Println(c()) //输出10
}
func closure(s []int) func() int {
return func() int {
return s[0] //该s是传入slice的地址,因此后续使用将一直使用传入的slice
}
}
2 defer
- 执行方式类似其它语言中的析构函数,在函数体执行结束后
按照调用顺序的相反顺序逐个执行 - 即使函数发生严重错误也会执行
- 支持匿名函数的调用
- 常用于资源清理、文件关闭、解锁以及记录时间等操作
- 通过与匿名函数配合可在return之后修改函数计算结果
- 如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer
时即已经获得了拷贝,否则则是引用某个变量的地址
/*输出顺序如下
j= 13
j= 13
j= 13
i= 2
i= 1
i= 0
*/
func funcDefer() {
for i := 0; i < 3; i++ {
defer fmt.Println("i=", i) //defer按照栈顺序出入
}
for j := 10; j < 13; j++ {
defer func() {
fmt.Println("j=", j) //传入闭包的j为地址,执行完函数后j=13,所以后续均为13
}() //后面的括号表示调用这个匿名函数
}
}
- Go 没有异常机制,但有 panic/recover 模式来处理错误
- Panic 可以在任何地方引发,但recover只有在defer调用的函数中有效
/*如果不使用recover()将输出
A
B
panic: B err
*/
/*使用recover()将输出
A
B
recover in B
C
*/
func pc() {
A := func() {
fmt.Println("A")
}
B := func() {
fmt.Println("B")
defer func() {
//recover相当于catch了异常,异常存入了err
if err := recover(); err != nil {
fmt.Println("recover in B")
}
}()
panic("B err") //相当于抛出异常
}
C := func() {
fmt.Println("C")
}
A()
B()
C()
}
GO入门——5. 函数的更多相关文章
- Swift语法基础入门三(函数, 闭包)
Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: ...
- python3入门之函数
相信大家学习过其他语言,懂得函数的作用.简单的说函数最好的作用就是可以使程序变得懒惰.python作为后起之秀,当然也会拥有函数这个有用的东西: 创建函数 使用def语句即可创建函数,如创建一个用来生 ...
- Python入门篇-函数、参数及参数解构
Python入门篇-函数.参数及参数解构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数概述 1>.函数的作用即分类 函数 数学定义:y=f(x) ,y是x的函数,x ...
- 1031: [编程入门]自定义函数之字符串反转(python)
问题 1031: [编程入门]自定义函数之字符串反转 时间限制: 1Sec 内存限制: 128MB 提交: 7225 解决: 3331 题目描述 写一函数,使输入的一个字符串按反序存放,在主函数中输入 ...
- Python入门之 函数
Python入门之 函数 1.初识函数 1.1 什么是函数? <1> 将某个功能封装到一个空间中就是一个函数 <2> 减少重复代码 1.2 定义函数 def -- python ...
- Scala入门之函数
/** * 函数可以被简单的被认为是包裹了一条或者几条语句的代码体,该代码体接收若干参数,经过代码体处理后返回结果,形如数学中的f(x) = x + 1 * 在Scala中函数式一等公民,可以向变量一 ...
- ECMAScript 6 入门 ----Generator 函数
本文转自:阮一峰老师的ECMAScript 6 入门,有时间可以看下评论! Generator 函数 简介 基本概念 Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不 ...
- Python入门day04_函数与装饰器
一.函数入门 什么是函数: # 函数:函数是一系列代码的集,用来完成特定功能的代码块,类似于工具,可以重复不但的去使用 为什么要有函数: # 优点:# 1. 避免代码的冗余 # 2. 让程序代码结构更 ...
- Kotlin入门(9)函数的基本用法
上一篇文章介绍了Kotlin新增的空安全机制,控制语句部分可算是讲完了,接下来将连续描述Kotlin如何定义和调用函数,本篇文章先介绍函数的基本用法. 前面几篇文章介绍控制语句之时,在setOnCli ...
- Swift高速入门之函数
函数 看一个函数的样例: func addNumbers( let a:Int,let b:Int)->Int{ return a+b; } 实现两个数相加.函数必须以func开头,后面是函数名 ...
随机推荐
- jquery取消事件冒泡的三种方法展示
jquery取消事件冒泡的三种方法展示 html代码 <!doctype html> <html> <head> <meta charset="ut ...
- Redis-4.0.11集群配置
版本:redis-3.0.5 redis-3.2.0 redis-3.2.9 redis-4.0.11 参考:http://redis.io/topics/cluster-tutorial. 集群 ...
- redis for lack of backlog
版本: redis-3.2.9 部署: 5台64G内存的物理机,每台机器启动2个redis进程组成5主5备集群,每台机器1个主1个备,并且错开互备. 问题: 发现redis进程占用内存高达40G,而且 ...
- Java数组、集合
Vector类 类似C#的ArrayList.可扩展的数组,带有一些特定方法 Hashtable类 与C#的类似 Enumeration接口 类似C#的枚举器
- linux grep进阶
1.搜寻特定字符串 搜寻特定字符串很简单吧?假设我们要从刚刚的文件当中取得 the 这个特定字符串,最简单的方式就是这样: 那如果想要『反向选择』呢?也就是说,当该行没有 'the' 这个字符串时才显 ...
- <c:forEach varStatus="status">中 varStatus的属性简介
我们常会用c标签来遍历需要的数据,为了方便使用,varStatus属性可以方便我们实现一些与行数相关的功能,如:奇数行.偶数行差异:最后一行特殊处理等等.先就varStatus属性常用参数总结下: $ ...
- apollo broker 启动流程
1.下载Apollo服务器,下载后解压,然后运行apache-apollo-1.6\bin\apollo.cmd,输入create mybroker(名字任意取,这里是根据官网介绍的来取的)创建服务器 ...
- petapoco 新手上路
PetaPoco是一个轻量级ORM框架 用法可参考http://www.toptensoftware.com/petapoco/ https://github.com/CollaboratingPl ...
- html\css不同长度文本左右对齐 text-align:justify的使用
在平常的开发过程中,对于text-align一般用到的是left,center,right,这三个属性都不会陌生.然而,对于justify的使用我却是很陌生.首先有个比较简单的例子. 如下代码: &l ...
- UWP 查找模板中的控件
这个标题我也不知道咋起,意思说一下你就明白. 1. 对官方控件的模板进行定制修改,以满足多样化需求,还有漂亮的UI 比如ListView,GridView等. 2. 在设计的情况下并没有这个控件,而在 ...