Golang断言与闭包如何使用(golang,开发技术)

时间:2024-05-04 10:03:02 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    Golang%E6%96%AD%E8%A8%80%E4%B8%8E%E9%97%AD%E5%8C%85%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8

Go中的断言用于判断变量的类型,其使用形式如下所示:

上面的代码是判断x是否为T类型的变量:

如果 T 的某个具体的类型,断言会检查 x 是否为该类型,如果是的话买就返回 x 以及一个布尔值true,反之返回一个false

如果 T 是接口类型,类型断言会检查 x 的动态类型是否满足 T。如果检查成功,返回值是一个类型为 T 的接口值,以及一个布尔值true,反之返回一个false

我们也可以不接受返回的布尔值,在这种情况下,如果断言失败,会直接panic,所以非常不推荐这种处理方式

另外,断言和可以与switch配合使用

闭包是由函数和与其相关的引用环境组合而成的实体。

概念上说起来有些抽象,下面我们以一个具体的例子来理解。

在上面的例子中,f1() 与他的变量x(值为1)共同组成了一个闭包,每次调用f1(),x的值就会+1并且打印。

从某种意义上来说,闭包延长了变量的生命周期(栈上分配改为了堆上分配)。

通过第一个例子,我们知道,函数以及其环境(传入的变量)组成了闭包,这个时候,如果传入的是一个指针,那么就会存在多个闭包共用一个变量的情况。

闭包的延迟绑定,通俗地说,就是闭包的函数在第一次调用的时候才会与环境的变量进行绑定,我们依然以上面提到的两个函数为例子:

我们创建了f1与f2两个闭包函数,以及变量 x 的值为1

在f1与f2创建的时候,变量并没有与函数绑定

第一次调用f2()时,&x与其绑定,x的值+1,变为2

第一次调用f1()时,x与其绑定,这时x已经变为2了,再+1,所以变为3

我们在一个函数中启动 Go Routine 调用另一个函数:

因为Go Routine的执行顺序是随机并行的,因此执行多次foo4()输出的顺序不一行相同,但是一定打印了“1,2,3,5”各个元素。

但是,如果我们以匿名函数的形式尝试复现上面的逻辑,会发现:

其实这个问题的本质同闭包的延迟绑定,或者说,这段匿名函数的对象就是闭包。在我们调用go func() { xxx }()的时候,只要没有真正开始执行这段代码,那它还只是一段函数声明。而在这段匿名函数被执行的时候,才是内部变量寻找真正赋值的时候。for-loop的遍历几乎是“瞬时”完成的,4个Go Routine真正被执行在其后,所以会产生上面的情况。

本文:Golang断言与闭包如何使用的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:怎么将一个CSV格式的文件分割成两个CSV文件下一篇:

4 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18