Tony Bai · Go 语言第一课
Tony Bai
资深架构师,tonybai.com 博主
21492 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 59 讲
开篇词 (1讲)
结束语 (1讲)
Tony Bai · Go 语言第一课
15
15
1.0x
00:00/00:00
登录|注册

21|函数:请叫我“一等公民”

高效运用
函数是“一等公民”
多返回值
函数参数
函数声明
Go函数:请叫我“一等公民”

该思维导图由 AI 生成,仅供参考

你好,我是 Tony Bai。
在前面的几讲中,我们学习了用于对现实世界实体抽象的类型,以及用来实现算法逻辑控制的几种控制结构。从这一讲开始,我们来学习一下 Go 代码中的基本功能逻辑单元:函数
学到这里,相信你对 Go 中的函数已经不陌生了,因为我们在前面的示例程序中一直都在使用函数。函数是现代编程语言的基本语法元素,无论是在命令式语言、面向对象语言还是动态脚本语言中,函数都位列 C 位。
Go 语言也不例外。在 Go 语言中,函数是唯一一种基于特定输入,实现特定任务并可返回任务执行结果的代码块(Go 语言中的方法本质上也是函数)。如果忽略 Go 包在 Go 代码组织层面的作用,我们可以说 Go 程序就是一组函数的集合,实际上,我们日常的 Go 代码编写大多都集中在实现某个函数上。
但“一龙生九子,九子各不同”!虽然各种编程语言都加入了函数这个语法元素,但各个语言中函数的形式与特点又有不同。那么 Go 语言中函数又有哪些独特之处呢?考虑到函数的重要性,我们会用三节课的时间,全面系统地讲解 Go 语言的函数。
在这一节课中,我们就先来学习一下函数基础,以及 Go 函数最与众不同的一大特点。我们先从最基本的函数声明开始说起。

Go 函数与函数声明

函数对应的英文单词是 Function,Function 这个单词原本是功能、职责的意思。编程语言使用 Function 这个单词,表示将一个大问题分解后而形成的、若干具有特定功能或职责的小任务,可以说十分贴切。函数代表的小任务可以在一个程序中被多次使用,甚至可以在不同程序中被使用,因此函数的出现也提升了整个程序界代码复用的水平
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Go语言函数作为“一等公民”具有灵活性和表达力,文章详细介绍了函数声明、类型、匿名函数、参数传递方式、多返回值等内容。函数可以存储在变量中,支持在函数内创建并通过返回值返回,作为参数传入函数,拥有自己的类型。通过清晰的例子和详细的解释,读者能够快速了解和掌握Go函数的特点和使用方法。文章还介绍了闭包的特性,展示了函数作为“一等公民”在实际生产中的灵活应用。整体而言,本文深入浅出地阐述了Go函数的灵活性和表达力,为读者提供了全面系统的Go函数知识。 文章中首先介绍了函数类型的妙用,以http包中的HandlerFunc类型为例,展示了函数类型的显式转型在特定领域的奇妙作用。其次,通过闭包的特性,文章展示了如何利用闭包简化函数调用,以partialTimes函数为例,演示了生成带有固定乘数的函数,减少参数重复输入的实际应用。最后,文章总结了Go函数的基本功能逻辑单元,函数声明、函数字面值的拆解,参数传递方式,多返回值等特点,并强调了Go函数作为“一等公民”的灵活性和表达力。 通过本文的阐述,读者能够深入理解Go函数的特性和使用方法,同时也能够从实际应用中感受到函数作为“一等公民”的灵活性。这篇文章对于想要系统学习Go函数知识的读者来说,是一份全面而深入的指南。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Tony Bai · Go 语言第一课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(27)

  • 最新
  • 精选
  • qinsi
    HandlerFunc还有另一半故事,就是函数也可以实现接口

    作者回复: 👍

    2021-12-04
    4
    37
  • aoe
    partialTimes 的例子就是传说中的柯里化啊

    作者回复: 对的。但作为入门课,就不谈那么多概念了。

    2021-11-30
    3
    19
  • 一打七
    ListenAndServe的第二个参数为什么要定义成接口类型?如果定义成函数类型,不就可以不用强转,直接传入了吗

    作者回复: 如果第二个参数只是一个函数类型,那那些Mux、middleware等就很难实现了。现在的各种Mux、middleware都是基于Handler这个接口类型实现的。 也就说如果第二个参数是函数类型,那么很难对其进行扩展了。

    2022-07-04
    3
    8
  • zhoufeng
    请教老师,使用type定义了一个新的类型后,为什么不需要显式转换。我写了一段代码说明我的问题。 func main() { var c cal=add //为什么这里不需要cal(add)转换? fmt.Printf("result is:%d",c(3,4)) } type cal func(int,int) int //定义了一个新的类型 func add(a int,b int) int { return a+b }

    作者回复: 看看我写的这篇文章 https://mp.weixin.qq.com/s/NCM-RrzxYiAUlAAYshdAaQ 也许能解答你的疑问。

    2022-01-06
    5
    6
  • Geek_fightingDC
    Go语言中的函数可以理解为一种类型。

    作者回复: 👍。就是一种类型!

    2021-12-28
    6
  • Witt
    wire 中使用函数作为返回值,统一回收资源也很方便

    作者回复: 👍

    2021-11-30
    4
  • 不说话装糕手
    Go 闭包是在函数内部创建的匿名函数,这个匿名函数可以访问创建它的函数的参数与局部变量。 在函数外面创建的匿名函数就不能叫闭包了吧 var t int var myFprintf = func (){ fmt.Println(t) }

    作者回复: 你理解的没错,如果你例子中的代码在包的顶层,即不再任何函数内部,那么这个不是闭包。这里匿名函数中的变量t并非捕捉,而仅仅是访问一个包级变量t。

    2022-09-26归属地:北京
    3
  • 0mfg
    白老师好,课程中如下示例代码,我用IDE跳转查看net/http包源代码,始终没有找到f(w, r)这里函数调用的w和r实参是从哪里得到的。作为小白我的这个问题在网上搜了很多net/http包源码解析的文章也没看到讲解这个内容的。个人理解r是不是从收到的tcp/ip包逐步解包到http层,从http包头和body里获取相应的信息然后赋值给http.Request结构体,然后得到r实参,如果理解没错源代码实现在哪或者如何查找呢?w实参如何得到又是如何得到的。希望白老师在百忙中能够指点一二,也祝白老师新年快乐,万事如意。 type HandlerFunc func(ResponseWriter, *Request) func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) { f(w, r) }

    作者回复: 星球中已经答复。这里贴出来供其他学员参考:在http包中的server.go的 func (c *conn) serve(ctx context.Context) 方法中。 r在同包的readRequest中定义。

    2022-01-04
    3
    3
  • Demon.Lee
    结构体传参,也是显示copy,所以有成本,如果不担心数据被修改,我理解改成传指针就可以了。 但为啥 go 把 c 语言里面的指针引用(->)给干掉了,统一改成了(.), 编译器帮忙把活给干了?是为了降低开发者负担吗? 谢谢老师。

    作者回复: 为啥没有使用->语法,这个我还真不清楚。也许就像你说的,都使用(.)保持形式一致统一。但似乎没有官方说法,至少我没有找到🙂。

    2022-06-21
    2
    2
  • lesserror
    感谢Tony Bai老师这一讲关于函数的内容,全篇都是干货。另外,有几个小问题,麻烦解惑。 1. 命令式语言一般是指哪些语言呢? 2. 关于Go中没有函数体的函数声明,有推荐阅读的资料吗? PS :希望后面能有利用闭包简化函数调用的更多例子。

    作者回复: 1. 所谓“命令式语言”是英文imperative languages的一种翻译。命令式的语言的一个特点就是程序员要完成是一件事,需要自己一步一步告诉 机器如何做,即把执行步骤用编程语言的语法罗列出来。如今主流的编程语言,如c, c++, java, go, python, ruby,无论是否是静态语言还是动态语言,无论是否支持面向对象编程,本质上都是命令式语言。那什么不是命令式语言呢?与命令式语言相对的是声明式语言,最常见的就是SQL,它的特点是你只要输入你想要的结果,语言引擎知道该执行什么步骤。历史上还有一种叫prolog的逻辑编程语言也是声明式的,如果对prolog感兴趣,可以看看我参与翻译的《七周七语言》一书。 2. 没有函数体的函数声明 更多用在go语言runtime实现层面,应用层极少使用,这方面参考资料甚少。 ~

    2021-12-01
    2
收起评论
显示
设置
留言
27
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部