golang学习系列——16. 函数(2)

 

一. 递归函数

定义

在函数体内调用自身函数

示例

func test(i int) {
    //todo
    test(j)
}

注意

大量的递归调用容易导致程序栈内存耗尽(栈溢出)

栈溢出一般可以通过惰性求值的技术来解决:golang 的话可以使用 channel 和 goroutine 来实现惰性求值,举例如下

func generatenums() chan int {
    nums := make(chan int)
    num := 0
    go func() {
        for {
            num++
            nums <- num
        }
    }()
    return nums
}
 
func getnums(nums chan int) int {
    return <-nums
}
 
func main() {
    nums := generatenums()
    for i := 0; i < 10; i++ {
        fmt.Println(getnums(nums))
    }
}

二. 回调函数

定义

函数作为参数传递给其他函数,然后在其他函数内调用执行。

示例

func test(a,b int, cb func(int, int)(int)) {
    fmt.Println(cb(a,b))
}

func add(a,b int) int {
    return a + b
}

三. 匿名函数

定义

没有函数名称的函数。

用法

匿名函数无法独立存在,编译器会报错。

1. 把匿名函数赋值给一个变量(保存函数的地址到变量中), 通过这个变量来调用函数

func test() {
    myfunc := func(x, y int) int { return x + y }
    fmt.Println(myfunc(1, 2))
}

2. 直接调用匿名函数

func test() {
    sum := func(x, y int) int {
        return x + y
    }(1, 2)
    fmt.Println(sum)
}

使用场景

1. 可以配合匿名函数使用,可以改变函数的命名返回值

2. 可以配合 go 关键字做 goroutine 使用

闭包

匿名函数也被称为闭包

描述一:闭包被允许调用定义在其他环境下的变量,可以捕捉到一些外部变量。

描述二:闭包继承了函数声明时的作用域,作用域内的变量被共享到闭包的环境中。

详细内容请看下一篇

四. 函数耗时计算

我们可以使用 time 包中的 Now() 和 Sub() 函数来完成

func test() {
    start := time.Now()
    defer func() {
        end := time.Now()
        fmt.Printf("test use time: %s", end.Sub(start))
    }()
    //todo such as time.Sleep(1 * time.Second)
}

当我们需要优化一段代码的时候,可以用来代码执行效率。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值