博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
玩转Go语言之闭包
阅读量:6838 次
发布时间:2019-06-26

本文共 3310 字,大约阅读时间需要 11 分钟。

talk is cheap show me the code!

函数基本使用

1.没形参,没返回值func say(){        fmt.Println("没有返回值没有形参")}复制代码

// 2.有返回值没有形参的函数// 2.1只有一个返回值的函数func getNumber()(int)func getNumber()int{     return 888}func getNumber() (num int){     num = 999     return}复制代码

// 2.2有多个返回值的函数func getValue() (int, int){	     return 666, 888}func getValue() (num int,value int)func getValue() (num ,value int){              num = 666              value = 888              return 666, 888}func test()(num int, temp float64, value int)func test()(num , value int, temp float64){}复制代码

// 3.没有返回值有形参的函数func sum(a int, b int)func sum(a , b int){      res := a + b            fmt.Println(res)}复制代码

// 4.有返回值有形参的函数func minus(a, b int)(res int){	     res = a - b	     return}func minus(a int, b int)(int){             res := a - b             return res}复制代码

总结:

1.C语言是由函数组成的

2.Go语言也是由函数组成的

3.C语言函数的格式

返回值类型 函数名称(形参列表){		被控制的语句;	}复制代码

4.Go语言函数的格式

func 函数名称(形参列表)(返回值列表){		被控制的语句;	}复制代码

5.C语言函数的类型

5.1没有返回值没有形参的函数5.2有返回值没有形参的函数5.3没有返回值有形参的函数5.4有返回值有形参的函数复制代码

6.Go语言函数的类型和C语言一样

注意点:

1.在C语言中如果函数的定义写在函数的调用之前必须先声明再调用在Go语言中如果函数的定义写在函数的调用之前, 不用声明就可以调用, Go语言没有声明2.Go语言中如果函数只有一个返回值, 那么返回值列表的()可以省略3.Go语言中如果有返回值, 可以在返回值列表中定义变量, 然后在函数体中直接使用4.如果在返回值列表中定义了变量,  那么return后面可以不用写任何内容, 默认就会将返回值列表中定义的变量返回5.Go语言中一个函数可以有多个返回值6.如果一个函数有多个返回值, 但是我们只想使用其中的一个, 那么可以在接收的时候使用_来忽略, 不需要的那个返回值7.因为_在Go语言中有特殊的含义, 所以在定义标识符的时候_不能单独作为标识符8.如果返回值列表中有多个返回值, 并且连续的多个返回值的数据类型都一样, 那么只用在最后一个变量后面添加数据类型即可9.如果形参列表中有多个形参, 并且连续的多个形参的数据类型都一样, 那么只用在最后一个变量后面添加数据类型即可复制代码

传值,与传指针

num := 666fmt.Println(num)666change1(num)fmt.Println(num)666change2(&num)fmt.Println(num)789func change1(a int) {	     a = 789}func change2(a *int) {	     *a = 789}1.在C语言中如果基本数据类型作为函数的参数, 是值传递, 在函数内修改形参不会影响到外界的实参2.Go语言和C语言一样/ int float bool3.如果想在函数内部修改外界传入的实参, 那么必须传入指针复制代码

匿名函数

C语言中指向函数的指针int test(int a, int b){}int (*test)(int, int)// test相当于找到函数的定义, 然后调用函数test()// 直接定义一个函数, 然后立即调用这个函数func(){	    fmt.Println("匿名函数")}()// 定义一个函数类型的变量, 保存匿名函数, 然后通过函数类型的变量调用匿名函数f := func() {        fmt.Println("匿名函数")}var f func() = func() {	    fmt.Println("匿名函数")}//fmt.Printf("%T\n", f)f()复制代码

总结:

1.什么是匿名函数?

普通的函数都是有名字的函数, 而匿名函数就是没有名字的函数复制代码

2.匿名函数的应用场景:

一般情况下某个函数只会被调用一次, 我们就会使用匿名函数作为函数的参数, 或者作为函数的返回值复制代码

3.注意点:

3.1匿名函数定义之后, 如果没有立即调用, 编译器会报错3.2也可以将一个匿名函数保存到一个变量中在C语言中我们知道, 我们可以定义一个指向函数的指针来保存函数的地址, 然后通过指针来调用函数在Go语言中函数是一等公民(可以定义变量, 作为形参, 作为返回值), 所以在Go语言中也可以用函数类型来定义变量(相当于C语言中指向函数的指针)3.3由于函数是一等公民, 所以以前定义变量所有的格式, 都可以用于定义函数类型的变量复制代码

var 变量名称 函数类型var 变量名称 函数类型 = 匿名函数var 变量名称  = 匿名函数变量名称  := 匿名函数var(    var 变量名称  = 匿名函数)复制代码

匿名函数使用场景:

1.作为函数参数result := calculate(10, 20, func(a, b int) int {                 return  a + b})fmt.Println(result)func calculate(a, b int, method func(int, int) int) (int) {                   res := method(a, b)                  return res}2.作为函数的返回值var fn func(int, int)intfn = test()res := fn(10, 20)fmt.Println(res)func test()func(int, int)int{	       return func(a int, b int)int {		              return a + b	       }}复制代码

闭包:

1.什么是闭包?

闭包就是一个特殊的匿名函数只要匿名函数中用到了外界的变量, 那么我们就把匿名函数叫做闭包复制代码

注意点:

只要闭包还在使用外界的变量, 那么外界的变量就会一直存在复制代码

func addUpper() func() {                x := 1                 return func() {                                 x++                                  fmt.Println(x) // 2 , 3 , 4	          }}fn := addUpper()fn()fn()fn()复制代码

转载于:https://juejin.im/post/5ba459a86fb9a05d12280641

你可能感兴趣的文章
Windows搭建golang开发平台
查看>>
多线程基础篇(3)——初试锁
查看>>
利用WSS搭建学生作业平台
查看>>
刚进入win7系统就提示检测到一个硬盘问题的解决方法
查看>>
Python之配置日志模块logging
查看>>
指定目录的所有 *.gif 文件都重命名为 *.jpg
查看>>
为11.2.0.2 Grid Infrastructure添加节点
查看>>
Linux运维课程 第一阶段 重难点摘要(六)CISCO
查看>>
inotify结合rsync监控目录的实时变化
查看>>
pfSense book之硬件配置指南
查看>>
存储过程总结 2
查看>>
js parsefloat
查看>>
快速启动神器 Wox
查看>>
第 34 章 Gnuplot
查看>>
WCF NetTcpBinding Transport安全模式(6) ClientCredentialType证书验证模式---- PeerTrust验证模式...
查看>>
选择HttpHandler还是HttpModule?
查看>>
HTC Desire 金卡制作方法
查看>>
C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型
查看>>
phpcurl 请求Chunked-Encoded data 遇到的一个问题
查看>>
ASPX页面中不放置Form元素的问题
查看>>