看 go 开源项目代码的时候,发现下面这种写法
func f() { a, err := func() (int, error){ .... }() ... }
我的疑问是这种写法有什么优点吗,感觉完全没必要啊。
1 Jirajine 2021-03-24 14:52:44 +08:00 via Android 能开一个新的 scope,能避免命名冲突、逻辑封装。 不过这种 IIFE 的写法真够丑陋的。 |
![]() | 2 yzbythesea 2021-03-24 15:00:53 +08:00 不推荐 |
![]() | 3 2379920898 2021-03-24 15:15:02 +08:00 我想到了脱了裤子放屁 |
![]() | 4 Wincer 2021-03-24 16:01:17 +08:00 在一个函数内创建的匿名函数能直接使用以及修改这个函数内的所有变量(当然变量定义需要在匿名函数之前),如果要写另一个函数做这个事的话,得把使用的变量作为参数传入(如果要修改还得传指针)。我能想到的优点就只有这个了 |
![]() | 5 bruce0 2021-03-24 16:22:12 +08:00 ![]() 我能想到的匿名函数用处 1. go 出一个协程 2. defer 处理一些东西 |
![]() | 6 meiyoumingzi6 2021-03-24 16:35:04 +08:00 用作闭包之类的, 类似 python 装饰器实现 |
7 xx6412223 2021-03-24 16:35:14 +08:00 这种写法就是欠打 |
![]() | 8 cominghome 2021-03-24 16:44:04 +08:00 你举的这个例子确有脱裤子放屁的嫌疑 目前我的使用场景和 #5 差不多,有时候不用想函数命名挺爽的 |
9 liyunlong41 2021-03-24 19:49:18 +08:00 via iPhone 之前看开源代码时,也看到有这种写法,是跟锁有关的代码,这样写可以用 defer 自动释放锁,防止忘记释放,同时也可以最小化锁的临界区。 |
10 sarvatathagata 2021-03-24 20:32:12 +08:00 怕不是 js 写习惯了 |
11 iceheart 2021-03-24 20:49:51 +08:00 via Android 嵌套循环什么的,一个 return 就跳出去了,就这点好处 |
![]() | 12 liuminghao233 2021-03-24 20:50:53 +08:00 via iPhone ![]() 匿名函数在 for 里面可以用 defer 来管理 mutex |
13 sxfscool 2021-03-24 21:41:17 +08:00 一般是用 defer 的 |
![]() | 14 ry_wang 2021-03-24 23:35:26 +08:00 通过函数调用有时可以避免使用 goto |
![]() | 15 darrh00 2021-03-24 23:56:26 +08:00 写程序最难一点的就是给函数命名,可能纯粹是想不到好名字吧? |
![]() | 16 User9901 2021-03-25 00:41:41 +08:00 多加一些类似的,用于生成免杀恶意程序。 增加分析难度。 |
![]() | 17 YYYeung 2021-03-25 01:04:33 +08:00 除了新开一个作用域的有点外,还有就是 查看代码的时候,我只需要知道这里是有一个 a, 但我并不关心这个 a 是怎么得来的(究竟它是求余得来的,还是经过其他复杂的运算) 这个 a 的计算,对于这个函数 f 的整个过程并不重要,重要的是有 a 这个值;接着,我就可以利用 IDE 的功能,把这个匿名函数的代码块折叠起来,那下一行,就继续是这个函数 f 的核心代码,继续往下看,避免不必要的干扰 毕竟有时候,求 a 这个值的时候,可能需要创建很多临时变量来使得代码清晰,但这部分计算逻辑又不复用,抽出一个函数又好像没有必要,命名又犯头痛 |
![]() | 19 yunyuyuan 2021-03-25 09:28:20 +08:00 js 习惯了,文件开头就是(function(){})() |
![]() | 20 HUNYXV 2021-03-25 10:07:30 +08:00 比如作为一个参数传递到工作池 |