08.手撕Go语言-函数

函数包含函数名、行参列表、函数体和返回值列表,使用func进行声明,函数无参数或返回值时则形参列表和返回值列表省略

定义&调用

定义

08.01.png

形参列表需要描述参数名及参数类型,所有形参为函数块局部变量。返回值需要描述返回值类型

举例:

  1. 无参&无返回值
08.02.png
  1. 有参&无返回值
08.03.png
  1. 有参&有返回值
08.04.png

调用

函数通过函数名(实参列表),在调用过程中实参的每个数据会赋值给形参中的每个变量,因此实参列表类型和数量需要函数定义的形参一一对应。针对函数返回值可通过变量赋值的方式接收s

08.05.png

参数

类型合并

在声明函数中若存在多个连续形参类型相同可只保留最后一个参数类型名

08.06.png
08.07.png

可变参数

某些情况下函数需要处理形参数量可变,需要运算符…声明可变参数函数或在调用时传递可变参数

  1. 定义

可变参数只能定义一个且只能在参数列表末端。在调用函数后,可变参数则被初始化为对应类型的切片

08.08.png
08.09.png
  1. 传递

在调用函数时,也可以使用运算符…将切片解包传递到可变参数函数中

08.10.png

返回值

在函数提中可以使用return关键字为函数调用这提供函数计算结果

多返回值

go语言支持函数有多个返回值,在声明函数时使用括号包含所有返回值类型,并使用return返回对应数量的用逗号分割数据

08.11.png

命名返回值

在函数返回值列表中可指定变量名,变量在调用时会根据类型使用零值进行初始化,在函数体中可进行赋值,同时在调用return时不需要添加返回值,go语言自动将变量的最终结果进行返回

在使用命名返回值时,当声明函数中存在若多个连续返回值类型相同可只保留最后一个返回值类型名

08.12.png
08.13.png

递归

递归是指函数直接或间接调用自己,递归常用于解决分治问题,将大问题分解为相同的小问题进行解决,需要关注终止条件

例如:

  1. 计算n阶乘
08.14.png
  1. 汉罗塔游戏
08.15.png

函数类型

函数也可以赋值给变量,存储在数组、切片、映射中,也可作为参数传递给函数或作为函数返回值进行返回

声明&初始化&调用

08.16.png

声明&调用参数类型为函数的函数

08.17.png
08.18.png

匿名函数与闭包

匿名函数

不需要定义名字的函数叫做匿名函数,常用做帮助函数在局部代码块中使用或作为其他函数的参数

08.19.png

闭包

匿名函数有叫闭包,是指在函数内定义的匿名函数引用外部函数的变量,只要匿名函数继续使用则外部函数赋值的变量不被自动销毁

08.20.png
08.21.png

值类型&引用类型

值类型和引用类型的差异在于赋值同类型新变量后,对新变量进行修改是否能够影响原来的变量,若不能影响则为值类型,若能影响则为引用类型

![08.22.png]](https://upload-images.jianshu.io/upload_images/692735-b544604dcabae7a1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

  • 值类型:数值、布尔、字符串、指针、数组、结构体等
  • 引用类型:切片、映射、接口等

针对值类型可以借助指针修改原值

08.23.png

针对值类型和引用类型在赋值后新旧变量的地址并不相同,只是引用类型在底层共享数据结构(其中包含指针类型元素)

值传递

值传递

在Go语言中参数传递默认均为值传递(形参为实参变量的副本),对于引用类型数据因其底层共享数据结构,所以在函数内可对引用类型数据修改从而影响函数外的原变量信息

08.24.png

指针传递

可以通过将变量的地址通过指类型递给函数,此时可通过指针对函数外的原变量进行修改

08.25.png

错误处理

error接口

Go语言通过error接口实现错误处理的标准模式,通过使用函数返回值列表中的最后一个值返回错误信息,将错误的处理交由程序员主动进行处理

08.26.png
08.27.png

error接口的初始化方法

  1. 通过errors包的New方法创建

  2. 通过fmt.Errorf方法创建

08.28.png

defer

defer关键字用户声明函数,不论函数是否发生错误都在函数执行最后执行(return之前),若使用defer声明多个函数,则按照声明的顺序,先声明后执行(堆)

常用来做资源释放,记录日志等工作

08.29.png

panic与recover函数

go语言提供panic和recover函数用于处理运行时错误,当调用panic抛出错误,中断原有的控制流程,常用于不可修复性错误。recover函数用于终止错误处理流程,仅在defer语句的函数中有效,用于截取错误处理流程,recover只能捕获到最后一个错误

  1. panic
08.30.png
  1. recover
08.31.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容