21|函数:请叫我“一等公民”
该思维导图由 AI 生成,仅供参考
Go 函数与函数声明
- 深入了解
- 翻译
- 解释
- 总结
Go语言函数作为“一等公民”具有灵活性和表达力,文章详细介绍了函数声明、类型、匿名函数、参数传递方式、多返回值等内容。函数可以存储在变量中,支持在函数内创建并通过返回值返回,作为参数传入函数,拥有自己的类型。通过清晰的例子和详细的解释,读者能够快速了解和掌握Go函数的特点和使用方法。文章还介绍了闭包的特性,展示了函数作为“一等公民”在实际生产中的灵活应用。整体而言,本文深入浅出地阐述了Go函数的灵活性和表达力,为读者提供了全面系统的Go函数知识。 文章中首先介绍了函数类型的妙用,以http包中的HandlerFunc类型为例,展示了函数类型的显式转型在特定领域的奇妙作用。其次,通过闭包的特性,文章展示了如何利用闭包简化函数调用,以partialTimes函数为例,演示了生成带有固定乘数的函数,减少参数重复输入的实际应用。最后,文章总结了Go函数的基本功能逻辑单元,函数声明、函数字面值的拆解,参数传递方式,多返回值等特点,并强调了Go函数作为“一等公民”的灵活性和表达力。 通过本文的阐述,读者能够深入理解Go函数的特性和使用方法,同时也能够从实际应用中感受到函数作为“一等公民”的灵活性。这篇文章对于想要系统学习Go函数知识的读者来说,是一份全面而深入的指南。
《Tony Bai · Go 语言第一课》,新⼈⾸单¥59
全部留言(27)
- 最新
- 精选
- qinsiHandlerFunc还有另一半故事,就是函数也可以实现接口
作者回复: 👍
2021-12-04437 - aoepartialTimes 的例子就是传说中的柯里化啊
作者回复: 对的。但作为入门课,就不谈那么多概念了。
2021-11-30319 - 一打七ListenAndServe的第二个参数为什么要定义成接口类型?如果定义成函数类型,不就可以不用强转,直接传入了吗
作者回复: 如果第二个参数只是一个函数类型,那那些Mux、middleware等就很难实现了。现在的各种Mux、middleware都是基于Handler这个接口类型实现的。 也就说如果第二个参数是函数类型,那么很难对其进行扩展了。
2022-07-0438 - 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-0656 - Geek_fightingDCGo语言中的函数可以理解为一种类型。
作者回复: 👍。就是一种类型!
2021-12-286 - Wittwire 中使用函数作为返回值,统一回收资源也很方便
作者回复: 👍
2021-11-304 - 不说话装糕手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-0433 - Demon.Lee结构体传参,也是显示copy,所以有成本,如果不担心数据被修改,我理解改成传指针就可以了。 但为啥 go 把 c 语言里面的指针引用(->)给干掉了,统一改成了(.), 编译器帮忙把活给干了?是为了降低开发者负担吗? 谢谢老师。
作者回复: 为啥没有使用->语法,这个我还真不清楚。也许就像你说的,都使用(.)保持形式一致统一。但似乎没有官方说法,至少我没有找到🙂。
2022-06-2122 - lesserror感谢Tony Bai老师这一讲关于函数的内容,全篇都是干货。另外,有几个小问题,麻烦解惑。 1. 命令式语言一般是指哪些语言呢? 2. 关于Go中没有函数体的函数声明,有推荐阅读的资料吗? PS :希望后面能有利用闭包简化函数调用的更多例子。
作者回复: 1. 所谓“命令式语言”是英文imperative languages的一种翻译。命令式的语言的一个特点就是程序员要完成是一件事,需要自己一步一步告诉 机器如何做,即把执行步骤用编程语言的语法罗列出来。如今主流的编程语言,如c, c++, java, go, python, ruby,无论是否是静态语言还是动态语言,无论是否支持面向对象编程,本质上都是命令式语言。那什么不是命令式语言呢?与命令式语言相对的是声明式语言,最常见的就是SQL,它的特点是你只要输入你想要的结果,语言引擎知道该执行什么步骤。历史上还有一种叫prolog的逻辑编程语言也是声明式的,如果对prolog感兴趣,可以看看我参与翻译的《七周七语言》一书。 2. 没有函数体的函数声明 更多用在go语言runtime实现层面,应用层极少使用,这方面参考资料甚少。 ~
2021-12-012