The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
lurenjiauser

最受不了的就是 golang 中的 if...else 语句了

  •  2
     
  •   lurenjiauser · Jan 19, 2025 · 11587 views
    This topic created in 657 days ago, the information mentioned may be changed or developed.

    代码密度太低了,经常要这么写:

    1: var val string
    2: if ok {
    3:	val = "okay"
    4: } else {
    5:	val = "fail"
    6: }
    

    即使优化一下,还有:

    1: val := okay
    2: if !ok {
    3:	val = "fail"
    4: }
    

    要是 kotlin,swift, java, c++, c ,来得多快啊,尤其很多个这种条件初始赋值的时候,看版面,就像在搞笑似的。

    92 replies  •  2025-01-21 19:29:40 +08:00
    lurenjiauser
    lurenjiauser
    OP
    Jan 19, 2025
    1
    java,c,c++也不错
    wojiugaiming
    wojiugaiming
    Jan 19, 2025 via Android❤️2
    2
    喜欢 golang 喜欢的不得了
    poltao
    poltao
    Jan 19, 2025
    3
    学会与自己和解,不要在意这些细节
    aloxaf
    aloxaf
    Jan 19, 2025❤️1
    4
    google 的语言设计水平和 MS 比就是一坨翔(用 golang 和 dart 有感
    SethShi
    SethShi
    Jan 19, 2025❤️1
    5
    楼上说得对, 试试 When(true, 1, 2)

    https://imgur.com/b1VdtLo
    SethShi
    SethShi
    Jan 19, 2025❤️3
    6
    youyouzi
    youyouzi
    Jan 19, 2025
    7
    前端表示很平和,和 js 逻辑一样
    kandaakihito
    kandaakihito
    Jan 19, 2025❤️1
    8
    go 的设计思想确实神奇,缺少很多特性。一查为什么没有,固定回答基本都是 “你自己可以手搓,那样更加 clear”
    w568w
    w568w
    Jan 19, 2025
    9
    @seth19960929 #6 这个很多时候不能平替条件运算符。比如如果 v1 、v2 是有副作用的,或者要执行很耗时的计算,那就没法用 When 了。

    ----

    另外 Go 就是 Google 做出来解决自己需求的,如果你觉得写起来难受,说明你的使用场景和 Google 那帮人不一样,就别硬用了。
    hefish
    hefish
    Jan 19, 2025
    10
    这样不是挺好嘛,能把工作量提高啊。。。
    dobelee
    dobelee
    Jan 19, 2025
    11
    这个确实很迷,还是保留 c++的三目运算符好一些。
    DefoliationM
    DefoliationM
    Jan 19, 2025
    12
    推荐使用 java,没必要和自己过不去,用自己喜欢的就行了。
    v1
    v1
    Jan 19, 2025
    13
    10 年前用 php 的时候也是有一群人喷不是强类型 = =| 其实不影响赚钱就行了,如果是自己的项目建议换自己喜欢的语言。
    guanzhangzhang
    guanzhangzhang
    Jan 19, 2025
    14
    那要是来个说受不了其他语言作用域的呢
    doraemonki
    doraemonki
    Jan 19, 2025 via Android
    15
    如无必要勿增实体
    xuxu555
    xuxu555
    Jan 19, 2025
    16
    hhhh, golang 确实是这样。不过不得不说,除了这个 err 判断繁琐点,其他真的挺简洁了。
    csys
    csys
    Jan 19, 2025❤️1
    17
    最简洁直观的:

    var val = if ok "okay" else "fail"

    或者

    var val = ok match {
    true => "okay",
    false => "fail"
    }
    liuliuliuliu
    liuliuliuliu
    Jan 19, 2025
    18
    推荐试一下 C# 😊
    akira
    akira
    Jan 19, 2025
    19
    这种小事情。。真不重要了。。
    lurenjiauser
    lurenjiauser
    OP
    Jan 19, 2025
    20
    @csys #17 这是啥语言啊?
    Leviathann
    Leviathann
    Jan 19, 2025
    21
    @doraemonki var val string 和下面的两处 val =,都属于无必要又增实体
    doraemonki
    doraemonki
    Jan 19, 2025 via Android
    22
    @Leviathann 从 Go 语言的设计哲学出发考虑,引入三元表达式增加的复杂度远超带来的收益,增加了理解难度还带来了代码风格的问题(深度嵌套的写法一定会出现),普通的 if else 是最常用的写法,足够简洁,即使是初学者也能一眼看懂
    fregie
    fregie
    Jan 19, 2025❤️4
    23
    代码密度高不一定是好事,越是简化的高级语法越难读,项目规模上来后简直是灾难
    满屏的高度浓缩三元表达不头疼吗
    SakuraNite
    SakuraNite
    Jan 19, 2025
    24
    学会与自己和解,不要在意这些细节,能解决问题就可以了
    extrem
    extrem
    Jan 19, 2025
    25
    总结一下就是,引入一般的三目运算符会导致在很多场景下与当前“go 哲学”相悖的用法出现,弊大于利,而在当前的计算机语言演进道路上又没有找到更好的办法了,所以索性维持现状
    extrem
    extrem
    Jan 19, 2025
    26
    我之前也经常要吐槽但后来发现确实是没办法,这些软件构建的基础设施的设计要考虑的比让我们不爽的点多得多,所以少即使多,没有完美的语言只有完美的选择
    proxytoworld
    proxytoworld
    Jan 19, 2025
    27
    没有三目运算符确实难受
    LaTero
    LaTero
    Jan 19, 2025 via Android
    28
    @extrem 有更好的方法呀,把 if 从 statement 改成 expression 就行,很多现代语言都支持类似这样的:
    var v = if (pred) a else b
    ixixi
    ixixi
    Jan 19, 2025
    29
    不喜欢就不要用,干嘛委屈自己
    zgcwkj
    zgcwkj
    Jan 19, 2025
    30
    你是想说没有**三目运算符**?
    lekai63
    lekai63
    Jan 19, 2025 via iPhone
    31
    比较适合“按代码行数算绩效”的公司使用 🐶
    victorc
    victorc
    Jan 19, 2025
    32
    你去用两天 rust
    回来看 go 哪哪都好
    sealinfree
    sealinfree
    Jan 19, 2025
    33
    改写为 go 的形式

    // When 三元表达式
    func When[T any](Check bool, TrueVal, FalseVal T) T {
    if Check {
    return TrueVal
    } else {
    return FalseVal
    }
    }
    sealinfree
    sealinfree
    Jan 19, 2025
    34
    使用效果 aaa := When(1 == 1, 1, 2)
    aaa 值为 1
    sagaxu
    sagaxu
    Jan 19, 2025❤️1
    35
    @sealinfree
    @seth19960929

    cond ? func1() : func2()

    自己封装的 When 具有短路效果吗?到达不了的分支不要计算
    redbule
    redbule
    Jan 20, 2025
    36
    如果你觉得不优雅,那么只有 pattern match 能满足你了。
    bzj
    bzj
    Jan 20, 2025
    37
    没看懂有什么问题
    bzj
    bzj
    Jan 20, 2025
    38
    你应该就属于那种认为 PHP 是全世界最好语言的群体
    IvanLi127
    IvanLi127
    Jan 20, 2025❤️1
    39
    @victorc 这事我干过,现在爱上了 rust🥰,看 go 不顺眼了
    sch1111878
    sch1111878
    Jan 20, 2025
    40
    @youyouzi 你平时不用 value ? 1 : 2 吗
    AV1
    AV1
    Jan 20, 2025
    41
    @sagaxu

    要惰性求值只能用 callback 了,不过 go 似乎没有箭头函数或者 lambda 表达,用起来依然很麻烦。🤣

    func when[T any](value bool, trueCallback func() T, falseCallback func() T) T {
    if value {
    return trueCallback()
    } else {
    return falseCallback()
    }
    }
    WaldenHorizon
    WaldenHorizon
    Jan 20, 2025
    42
    这种小事无所谓吧,需要的自己手搓,语言最重要的还是生态
    lurenjiauser
    lurenjiauser
    OP
    Jan 20, 2025
    43
    @wangritian #42 go 的生态没得说,那标准库杠杠的,底层设计的接口真的稳健无比。

    相比起来 rust ,语言是优美,但基础库、接口规范,那简直,尤其是 crypto 这块,没法看啊。
    KimiArthur
    KimiArthur
    Jan 20, 2025 via Android
    44
    @aloxaf dart 语法不是很简单明了吗?
    muam
    muam
    Jan 20, 2025
    45
    @zhwguest #20 python and js (或者 js 衍生的 ts 之类)
    spritecn
    spritecn
    Jan 20, 2025
    46
    java 已经习惯 了这么写
    ```
    if a
    return a;
    ```
    ikaros
    ikaros
    Jan 20, 2025
    47
    你可以用 rust 啊
    A5SqQoWI1DOXm7Y7
    A5SqQoWI1DOXm7Y7
    Jan 20, 2025
    48
    这都不算啥,关键是不同小版本之间还语言不一致,这就恶心了
    ryan961
    ryan961
    Jan 20, 2025
    49
    如果这么写呢?
    ufan0
    ufan0
    Jan 20, 2025
    50
    @aloxaf dart 越写越爽,有什么槽点吗?
    Felldeadbird
    Felldeadbird
    Jan 20, 2025
    51
    哈哈,这就不得不提 go 没有三目运算符的事情了。
    Rehtt
    Rehtt
    Jan 20, 2025 via Android
    52
    golang 的优点是不管水平高低写的代码都能一眼看懂 提高协作效率
    uds9u32br
    uds9u32br
    Jan 20, 2025
    53
    虽然我挺喜欢 go 的,但是我寻思三目加上去也不太影响可读性啊。
    supuwoerc
    supuwoerc
    Jan 20, 2025
    54
    @ryalu 这是谁的部将!
    youyouzi
    youyouzi
    Jan 20, 2025
    55
    我想着是上面代码也没毛病啊,就算不用三目,直接 if else 问题也不大啊
    crayygy
    crayygy
    Jan 20, 2025❤️1
    56
    @uds9u32br 三目本身没有影响,但不能阻止有人往三目里面再多加几次三目,我看过几次我们的 C++ 代码里面这么写的,给人恶心坏了,宁可啰嗦一点。所以我喜欢 Java 和 Go ,虽然啰嗦,但是适合工程化,大家写出来的代码都差不多
    fffq
    fffq
    Jan 20, 2025
    57
    自己搓个三目 func ,多大点事
    vfs
    vfs
    Jan 20, 2025❤️1
    58
    跟你相反, 我就是喜欢它要求的这种。 感觉代码读起来很清整,赏心悦目的。
    lazypu
    lazypu
    Jan 20, 2025
    59
    @ryalu 优雅,有我的风范,充满了不可替代性,将塑料碗打造成铁饭碗!
    fuhanfeng
    fuhanfeng
    Jan 20, 2025
    60
    我在想 go 的设计者自己会不会也不爽某些写法,但又担心一直加特性破坏 go 设立之初的目标,然后内心十分纠结
    SethShi
    SethShi
    Jan 20, 2025
    61
    @sagaxu When 场景就是二值取一, 想要短路效果就用 false && fn(), 如果既想又要貌似没看到有对应的代码段
    fioncat
    fioncat
    Jan 20, 2025
    62
    你需要 rust

    let val = if ok { "okay" } else { "fail" };
    nxcdJaNnmyF9O90X
    nxcdJaNnmyF9O90X
    Jan 20, 2025
    63
    脑子有坑吧 这也来黑 用不惯回去用抹脚布
    uds9u32br
    uds9u32br
    Jan 20, 2025
    64
    @crayygy 你这么一说确实,还有嵌套的情况,那还是别加了吧
    funnyecho
    funnyecho
    Jan 20, 2025
    65
    看评论才直到,op 想要个三目?

    我觉得优化后的那个版本已经很好了(初始化和条件分支要挨在一起)。后面加分支,那都是随手的事。
    me1onsoda
    me1onsoda
    Jan 20, 2025
    66
    写的恶心看的舒服
    x1aoYao
    x1aoYao
    Jan 20, 2025❤️4
    67
    @xingjue 大家都在讨论只有你在喷。怎么你的脑子和 Go 一样有坑还是大道至简了?
    aababc
    aababc
    Jan 20, 2025
    68
    @ryalu #49 怎么这么老长的代码
    x1aoYao
    x1aoYao
    Jan 20, 2025❤️1
    69
    尤其是在子作用域,返回多值的函数,只有其中一个想赋值修改外层的变量,其余的初始化
    就只能提前定义其余变量,否则直接:=外层的变量就不是被修改而是遮盖了。Go 没有元组,这个就很别扭。
    zhady009
    zhady009
    Jan 20, 2025
    70
    @Rehtt 这跟写的人有关系跟语言关系不太大,就像上面发的代码一样。而且太多技术性代码在业务代码里反而读起来没那么好一眼看出主体逻辑
    yazinnnn0
    yazinnnn0
    Jan 20, 2025
    71
    换家不用写 go 的单位吧
    faimin
    faimin
    Jan 20, 2025❤️1
    72
    特性少也有好处,这样可以少一些炫技的骚操作,大家写出来的代码就都一样了,维护起来也方便😄
    zxjxzj9
    zxjxzj9
    Jan 20, 2025❤️1
    73
    恰恰相反最喜欢 go 这种干掉三目运算符的做法。。。 确实不容易看花眼,多写几行没事的,特别是现在很多都是 ai 写的了
    zhaoahui
    zhaoahui
    Jan 20, 2025
    74
    Go 就图一个简单
    iyaozhen
    iyaozhen
    Jan 20, 2025
    75
    没懂,其它语言 if else 不这样写?楼主举个例子呢?

    还是想要三目运算符?

    但这就是 go 的设计特性,语言的简洁。三目最大的问题是可以无限嵌套,看起来很麻烦
    xiaocaiji111
    xiaocaiji111
    Jan 20, 2025
    76
    @kandaakihito 我们业务用了,后面业务复杂起来,简直要痛苦死了。特性太少,刚开始非常轻量,后面要啥啥没有
    xiaocaiji111
    xiaocaiji111
    Jan 20, 2025
    77
    @uds9u32br 对,总是说影响复杂度,复杂度,会编码得都能看懂三目吧,我怀疑是增加 go 团队得复杂度,而不是用户得,所以不加。
    CodingIran
    CodingIran
    Jan 20, 2025
    78
    @ufan0 作为同时写 Flutter 和 iOS 原生的吐槽几点 Dart:

    1.枚举不能忽略名称,静态变量(方法)不能忽略类名
    ```dart
    currentConnectivityType: ConnectivityResult.wifi 👎

    currentConnectivityType: .wifi 👍
    ```

    ```dart
    return Container(color: Colors.white, ... 👎

    return Container(color: .white, ... 👍
    ```

    2.函数方法默认值鸡肋
    有默认值的参数必须使用 `{}` 包起来,而且必须放在方法的最后,甚至默认值只能是常量 😵‍💫

    ```dart
    void foo(int arg1, { int arg2 = 0, int arg3 = 0 }) 👎

    void foo(int arg1 = 0, int arg2, int arg3 = 0) 👍
    ```

    3.必须显性的书写 const
    `EdgeInsets.only(top: 8)` 显然是一个常量,为何需要显性的写上 `const`,而不是编译器或 IDE 自动处理

    ```dart
    padding: const EdgeInsets.only(top: 8) 👎

    padding: .only(top: 8 ) 👍
    ```

    4.残缺的 Optional ?

    ```dart
    class Foo {
    final int? count;

    void test() {
    if (count != null) {
    count += 1; ❌
    count! += 1; ❌
    }
    }
    }

    上面的代码无法编译通过,因为 count 定义为 `int?`,即使已经判断了非空,获取它之前仍然需要 `unwrap`,只能写:

    count = count! + 1; 😅

    ```

    5.异常处理理念落后

    下面是个经典的 Dart 异常处理流程,存在 2 个问题:
    - 可能抛出异常的方法没有明显的标志,只能依靠文档和阅读源码来确定这个方法是否会抛出异常,因此调用时很难确定一个方法是否需要` try catch`
    - try 的 {} 内通常包含多个方法的组合调用,除非查看各个方法的实现,否则很难判断出哪些方法是会抛出异常的


    ```dart

    // 定义一个可能抛出异常的方法
    void functionCanThrowException() {
    ....

    throw Exception('xxxxxxx');
    }

    // 调用
    try {
    functionA();
    functionB();
    functionCanThrowException();
    functionC();
    } catch(e) {
    // handle error
    }

    ```

    6.反人类的 json 序列化
    竟然需要借助 json_serializable 之类的插件才能完成其他语言自动实现的功能,生成一大堆 .g.dart 文件更是丑陋
    aladdinding
    aladdinding
    Jan 20, 2025
    79
    只有一种写法不好吗
    jeesk
    jeesk
    Jan 20, 2025 via Android
    80
    @aladdinding

    这种肯定是最好的, 否则
    fori
    forindex
    forin
    iterater
    while

    看着头大, 语法糖越多越恶心
    jeesk
    jeesk
    Jan 20, 2025 via Android
    81
    语法糖 越加越多就成💩,
    jeesk
    jeesk
    Jan 20, 2025
    82
    没吐槽到重点:

    毕竟 if else 完全可以优化

    func result(bool2 bool, first any, two any) any {
    if bool2 {
    return first
    } else {
    return two
    }
    }
    ufan0
    ufan0
    Jan 20, 2025❤️1
    83
    @CodingIran 很久没有见到如此认真对待的回复了,让我找回了很多年前的论坛感受,回复中的其中几项,在我刚接触 Dart 的时候蛮苦恼的。

    2. 个人还是蛮喜欢这个设计的,看起来清晰,review 代码的时候能够一目十行。关于默认值只能是常量,我接触的几个静态语言似乎均是如此设计;

    3. 关于 const ,我并非编译领域大牛,不知道为何如此设计,前期看到很头疼,用习惯了后多数能通过 IDE ( Alt + Enter )自动重构,倒也是习惯了;

    4. 被困扰中,我也发现了该问题,并且此前在 Github 看过相关 issue ,目前仍为 open 状态;

    5. 被困扰中,且 IDE 提示蛮鸡肋;

    6. 此为做 UI 相关开发时候的取舍了,提升性能吧。换言之,如果不是开发 UI 相关,那么这个问题就不是问题了,我也在用 Dart 写后端。
    AV1
    AV1
    Jan 20, 2025
    84
    @CodingIran
    有点不对吧,dart 的默认参数、可选参数是放在方括号[]里,而不是大括号{}里,比如
    String say(String from, String msg, [String device = 'carrier pigeon']) {/**/}

    而大括号{}里的参数,相当于 python 的关键字参数(**kwargs )。

    这倒也体现了 dart 函数参数声明的复杂,易混,难记。🐶
    nxcdJaNnmyF9O90X
    nxcdJaNnmyF9O90X
    Jan 20, 2025
    85
    @x1aoYao 月经贴 脑子有泡 就别用 go 啊 逼你用了吗 拉黑了 sbb
    lurenjiauser
    lurenjiauser
    OP
    Jan 20, 2025
    86
    @x1aoYao 千万别在意,有些人吧,就是不会讨论问题,上来就是人身攻击。被这种人拉黑了最舒服。
    youngzy
    youngzy
    Jan 20, 2025
    87
    三元在单层的情况下还好,但挡不住有人喜欢套娃
    如果我看到
    ` a ? b ? e : f : c ? d : e ? g : h `
    我肯定心态直接爆炸

    我宁可放弃使用单层的三元也不想去看别人写的套娃
    Rickkkkkkk
    Rickkkkkkk
    Jan 20, 2025
    88
    一种逻辑多种写法绝大多数情况下都是缺点,特别是写业务逻辑。

    啰嗦不是问题
    echoZero
    echoZero
    Jan 21, 2025
    89
    @youngzy 同感,三元表达式 大多数用起来没问题,少部分喜欢套娃,一个三元表达式把人看的一愣一愣的
    ufan0
    ufan0
    Jan 21, 2025
    90
    @Livid #85 #63 xingjue 账号多次人身攻击,且没有缘由,看其历史回帖多数也充满不良言论。
    kingcanfish
    kingcanfish
    Jan 21, 2025
    91
    @ryalu 你就说能不能跑吧!
    Livid
    Livid
    MOD
    PRO
    Jan 21, 2025
    92
    @ufan0 谢谢,那个账号已经被彻底 ban 。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1503 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 315ms · UTC 15:33 · PVG 23:33 · LAX 07:33 · JFK 10:33
    ♥ Do have faith in what you're doing.