0
点赞
收藏
分享

微信扫一扫

Go语言学习笔记(四)

玉新行者 2022-02-07 阅读 130

Go语言学习笔记(四)

1,go中的递归

函数(与c类似)实现斐波那契数列

package main

import "fmt"

const LIM = 40

func main() {
    var a [LIM]int
    for i := 0; i < LIM; i++ {
        a[i] = fibonacci(i)
    }
    fmt.Println(a)
}

func fibonacci(n int) (res int) {
    if n <= 1 {
        res = 1
    } else {
        res = fibonacci(n-1) + fibonacci(n-2)
    }
    return
}

输出结果:
在这里插入图片描述

1,匿名函数和闭包

1,匿名函数

匿名函数是指不需要定义函数名的一种函数实现方式。

在Go语言中,函数可以像普通变量一样被传递或使用,这与C语言的回调函数比较类似。不同的是,Go语言支持随时在代码里定义匿名函数。

匿名函数由一个不带函数名的函数声明和函数体组成,如下所示:

func(a,b int ,z float64)bool{
	return a+b<int(z)
}

匿名函数可以直接赋值给一个变量或者直接执行:

a :=func(x,y int) int {
	return x + y
}
func(b chan int){
	b<-c
}(replay_chan)

2,闭包

Go 函数可以是一个闭包。闭包是一个函数值,它引用了函数体之外的变量。

这个函数可以对这个引用的变量进行访问和赋值;换句话说这个函数被“绑定”在这个变量上。

我的不靠谱的理解,一个闭包相当于一个类的实例,函数体之外的变量相当于这个实例存储的变量。

没有闭包的时候,函数就是一次性买卖,函数执行完毕后就无法再更改函数中变量的值(应该是内存释放了);

有了闭包后函数就成为了一个变量的值,只要变量没被释放,函数就会一直处于存活并独享的状态,因此可以后期更改函数中变量的值(因为这样就不会被go给回收内存了,会一直缓存在那里)。
闭包的主要意义

缩小变量作用域,减少对全局变量的污染。下面的累加如果用全局变量进行实现,全局变量容易被其他人污染。

同时,所有我要实现n个累加器,那么每次需要n个全局变量。

利用背包,每个生成的累加器myAdder1, myAdder2 := adder(), adder()有自己独立的sum,sum可以看作为myAdder1.sum与myAdder2.sum。

利用背包可以实现有自身状态的函数!

package main

import (
	"fmt"
)

func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}

func main() {
	myAdder := adder()
	
	// 从1加到10
	for i := 1; i <= 10; i++ {
		myAdder(i)
	}
	
	fmt.Println(myAdder(0))
	// 再加上45
	fmt.Println(myAdder(45))
}

输出结果

55// 1+...+10
100

参考借鉴go语言的闭包

举报

相关推荐

0 条评论