昨天我们讲到了切片,切片可以用内奸函数make来创建,同样也是创建动态数组的方式,make函数会分配一个元素为零值的数组并返回一个引用了它的切片,一般来说make有两个参数,第一个是你要切片的数据,第二个是要切片的长度,如果需要指定它的容量就需要传入第三个参数,切片可以包含任何类型,甚至包括其他的切片,理解起来就是数组可包含数组 就是二维的数组,二维的切片。
在访问切片的时候 除了单纯的for循环之外还有一个for循环的range形式可以遍历,当使用for循环便利切片的时候,每次迭代都会返回两个值,第一个值为当前元素的下标,第二个值是该下标所对应元素的一份副本也就是一个引用。
当我们使用rang函数的时候就会返回两个一个是i就是当前数组的下标,另一个就是v 当前访问位置的引用。
Go语言中有个名次叫映射,当我第一次听到这个名词的时候有点不解,我认为映射可能就是类似于引用的东西,一直没能理解,后来看了一些实例程序才明白,映射和c++里边的map是同一个意思。
这里创建了一个映射也就是map,他的key值是string类型,value是int类型。
添加的时候和stl里的map是一样的直接用【】来添加,删除的时候就需要用delete函数,并且go语言里边可以通过双赋值来检测某个键是否存在,例如上边的例子,v和ok两个值,如果m里边的key值存在Answer的话,v会得到Answer对应的value值,并且ok为真,如果不存在对应的key值的话,v得到的就是一个0,ok得到的就是false
在c++中引入了异常的概念,在go语言里边有error值来表示错误状态,通常来说函数会有一个error返回值,调用的他的代码应当判断这个错误是否等于nil来进行错误处理。
在这个函数里边定义run函数里边返回了error类型的数据,当我们再调用这个函数的时候就可以通过err来接受我们的错误 进行判断如果为nil那说明这个函数没有出现问题,如果不为nil那就说明出现问题了,就把问题打印出来
今天我们再对go语言的函数有一个更深的学习,在go语言中声明和c语言是有很多不同的,之外还有一个很大的特性,就是go语言允许有多个返回值,经常就是一个正确的返回值 一个错误的返回值,通过这个错误的返回值来判断当前函数中执行是否存在问题。
在go语言中有个十分重要的概念叫做函数的闭包,下午理解了半天还是没能理解清楚到底什么是闭包, 现在有了一些自己的理解。网上有很多介绍闭包的,说go语言中函数可以是一个闭包,闭包就是一个函数值,他引用了函数体之外的变量,甚至有的认为,一个闭包相当于一个类的实例,函数体之外的变量相当于这个实例存储的变量,当没有闭包的时候,函数就是一次性的买卖函数执行完毕后就没有办法再改变函数中的变量的值,有了闭包之后函数就成了一个变量的值,只要变量没有被释放,函数就一直存活并且是一个独享的状态。网上关于闭包的介绍很多,看自己的理解,我认为还是看代码比价容易清楚到底什么是闭包。
当执行这个函数的时候就会明白闭包的意义
我们发现两闭包来执行是独立的,那现在就比较容易明白什么是闭包了,闭包就是函数和它所引用的环境,闭包=函数+环境 上边的匿名环境中,虽然没有定义x,但是他引用了他所在的环境中的变量,f1和f2引用的是不同的环境 ,在调用x++时修改的不是同一个x,因此两个函数的第一次输出都是1,所以说没有闭包的时候我们的函数就像是一个一次性买卖,之前都有栈帧 的概念,没执行一个函数他都是没有记忆的,我不知道我执行了多少次,上次的变量和这次是独立开的没有任何关系的,但是闭包就不同,闭包就不再是一个一次性的买卖了 可以理解成它是有一定的记录性。
Go语言闭包的产生有两个必要的条件,一个是嵌套的匿名函数,一个是运行环境,当你改变运行环境的时候 闭包回重新生成。在总结一下,闭包是由外部函数嵌套内部函数,内部函数银红了外部函数的变量,当闭包形成之后,外部函数用完以后。本该销毁的变量,可以被内部函数引用并且保留下摆,作为自由变量使用。