V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
yujianwjj
V2EX  ›  Go 编程语言

go 函数中的匿名函数

  •  
  •   yujianwjj · 2021-03-24 14:46:37 +08:00 · 3157 次点击
    这是一个创建于 1369 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看 go 开源项目代码的时候,发现下面这种写法

    func f() {
      a, err := func() (int, error){
          ....
      }()
      ...
    }
    

    我的疑问是这种写法有什么优点吗,感觉完全没必要啊。

    20 条回复    2021-03-25 10:07:30 +08:00
    Jirajine
        1
    Jirajine  
       2021-03-24 14:52:44 +08:00 via Android
    能开一个新的 scope,能避免命名冲突、逻辑封装。
    不过这种 IIFE 的写法真够丑陋的。
    yzbythesea
        2
    yzbythesea  
       2021-03-24 15:00:53 +08:00
    不推荐
    2379920898
        3
    2379920898  
       2021-03-24 15:15:02 +08:00
    我想到了脱了裤子放屁
    Wincer
        4
    Wincer  
       2021-03-24 16:01:17 +08:00
    在一个函数内创建的匿名函数能直接使用以及修改这个函数内的所有变量(当然变量定义需要在匿名函数之前),如果要写另一个函数做这个事的话,得把使用的变量作为参数传入(如果要修改还得传指针)。我能想到的优点就只有这个了
    bruce0
        5
    bruce0  
       2021-03-24 16:22:12 +08:00   ❤️ 2
    我能想到的匿名函数用处

    1. go 出一个协程

    2. defer 处理一些东西
    meiyoumingzi6
        6
    meiyoumingzi6  
       2021-03-24 16:35:04 +08:00
    用作闭包之类的, 类似 python 装饰器实现
    xx6412223
        7
    xx6412223  
       2021-03-24 16:35:14 +08:00
    这种写法就是欠打
    cominghome
        8
    cominghome  
       2021-03-24 16:44:04 +08:00
    你举的这个例子确有脱裤子放屁的嫌疑

    目前我的使用场景和 #5 差不多,有时候不用想函数命名挺爽的
    liyunlong41
        9
    liyunlong41  
       2021-03-24 19:49:18 +08:00 via iPhone
    之前看开源代码时,也看到有这种写法,是跟锁有关的代码,这样写可以用 defer 自动释放锁,防止忘记释放,同时也可以最小化锁的临界区。
    sarvatathagata
        10
    sarvatathagata  
       2021-03-24 20:32:12 +08:00
    怕不是 js 写习惯了
    iceheart
        11
    iceheart  
       2021-03-24 20:49:51 +08:00 via Android
    嵌套循环什么的,一个 return 就跳出去了,就这点好处
    liuminghao233
        12
    liuminghao233  
       2021-03-24 20:50:53 +08:00 via iPhone   ❤️ 1
    匿名函数在 for 里面可以用 defer 来管理 mutex
    sxfscool
        13
    sxfscool  
       2021-03-24 21:41:17 +08:00
    一般是用 defer 的
    ry_wang
        14
    ry_wang  
       2021-03-24 23:35:26 +08:00
    通过函数调用有时可以避免使用 goto
    darrh00
        15
    darrh00  
       2021-03-24 23:56:26 +08:00
    写程序最难一点的就是给函数命名,可能纯粹是想不到好名字吧?
    User9901
        16
    User9901  
       2021-03-25 00:41:41 +08:00
    多加一些类似的,用于生成免杀恶意程序。
    增加分析难度。
    YYYeung
        17
    YYYeung  
       2021-03-25 01:04:33 +08:00
    除了新开一个作用域的有点外,还有就是

    查看代码的时候,我只需要知道这里是有一个 a, 但我并不关心这个 a 是怎么得来的(究竟它是求余得来的,还是经过其他复杂的运算)

    这个 a 的计算,对于这个函数 f 的整个过程并不重要,重要的是有 a 这个值;接着,我就可以利用 IDE 的功能,把这个匿名函数的代码块折叠起来,那下一行,就继续是这个函数 f 的核心代码,继续往下看,避免不必要的干扰

    毕竟有时候,求 a 这个值的时候,可能需要创建很多临时变量来使得代码清晰,但这部分计算逻辑又不复用,抽出一个函数又好像没有必要,命名又犯头痛
    YYYeung
        18
    YYYeung  
       2021-03-25 01:05:26 +08:00
    @YYYeung typo: 除了新开一个作用域的「优点」外
    yunyuyuan
        19
    yunyuyuan  
       2021-03-25 09:28:20 +08:00
    js 习惯了,文件开头就是(function(){})()
    HUNYXV
        20
    HUNYXV  
       2021-03-25 10:07:30 +08:00
    比如作为一个参数传递到工作池
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   884 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:56 · PVG 05:56 · LAX 13:56 · JFK 16:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.