go 函数中的匿名函数 - V2EX
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 3447 次点击
    这是一个创建于 1663 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看 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     Solana     5676 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 06:36 PVG 14:36 LAX 23:36 JFK 02:36
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86