<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          離譜么? Go 憑啥不支持三元運算符?

          共 2318字,需瀏覽 5分鐘

           ·

          2021-06-11 17:14

          大家好,我是煎魚。

          這是一個很多其他語言工程師轉(zhuǎn) Go 語言的時間節(jié)點,這就難免不論一番比較。其中一個經(jīng)典的運算上的就是 “三元運算符”:

          593e21285f1ce349a0495c115ae37c91.webp

          為什么 Go 語言不支持三元運算符,Go 不支持三元運算符就是設(shè)計的不好,是歷史在開倒車嗎?

          今天就由煎魚來和大家一起摸索為什么。

          三元運算符是什么

          三元運算符,在典型的數(shù)學(xué)意義上,或者從解析器的角度來看,是一個需要三個參數(shù)的運算符。而我們?nèi)粘V?,最常見的是二元運算符:

          x?+?y
          x?/?y
          x?*?y

          還有一元運算符:

          -a
          ~b
          !c

          以及今天的男主角 “三元運算符”。在 C/C++ 等多種語言中,我們可以根據(jù)條件聲明和初始化變量的習(xí)慣來選擇性使用三元條件運算符:

          int?index?=?val?>?0???val?:?-val

          Go 使用三元運算符

          想在 Go 語言里也使用三元運算符時,發(fā)現(xiàn)居然沒有...想要實現(xiàn)與上面相同的代碼段的方式似乎只能:

          var?index?int

          if?val?>?0?{
          ????index?=?val
          }?else?{
          ????index?=?-val
          }

          看上去十分的冗余,不夠簡潔。

          為什么 Go 沒有三元運算符

          為什么 Go 沒有 ?: 操作符,沒有的話,官方推薦的方式是怎么樣的。

          通過 Go FAQ 我們可以得知:

          1f502290ce6bde53ff29447e38b8f886.webp

          Go 官方就是推薦我們使用前面提到的方式來替代,并且明確了如下態(tài)度:

          • Go 中沒有 ?: 的原因是語言的設(shè)計者看到這個操作經(jīng)常被用來創(chuàng)建難以理解的復(fù)雜表達式。
          • 在替代方案上,if-else 形式雖然較長,但無疑是更清晰的。一門語言只需要一個條件控制流結(jié)構(gòu)。

          整體來講,Go 語言的設(shè)計者是為了考慮可讀性拒絕了實現(xiàn)三元運算符,"less is more." 也是標(biāo)榜臺詞了。

          社區(qū)爭議

          Go 語言的一些點與眾不同,基本是大家皆知的。無論是 if err != nil,又或是本次的三元運算符,要大家用 if-else 替代:

          if?expr?{
          ????n?=?trueVal
          }?else?{
          ????n?=?falseVal
          }

          反對和同意

          反對

          因此有社區(qū)小伙伴給出了反對,基本分為如下幾類:

          1. 認(rèn)為 if-else 也有以類似情況能被濫用,設(shè)計者的理由不夠充分,認(rèn)為是 “借口”。
          2. 認(rèn)為三元運算符的 “丑陋” 問題,是開發(fā)者的編碼問題,而不是語言問題。三元在各種語言中很常見,它們是正常的,Go 語言也應(yīng)該要有。
          3. 認(rèn)為用 if-else 替代三元運算符也很麻煩,讓開發(fā)者多讀了 3-4 行和額外的縮進級別。

          同意

          認(rèn)可這個決策的也有不少,為此給出了大量的真實工程案例。

          一般來講,我們用三元運算符是希望這么用:

          cond???true_value?:?false_value

          你可能見過這么用:

          cond???value_a?+?value_b?:?value_c?*?value_d

          還見過這樣:

          (((cond_a???val_one)?:?cond_b)???val_two)?:?val_three

          cond_a???(val_one?:?(cond_b???(val_two?:?val_three)))

          還能嵌套三元運算符:

          int?a?=?cond_a???val_one?:
          ????cond_b???val_two?:
          ????cond_c???val_three?:?val_four;

          也能出現(xiàn)可讀性更差的:

          void?rgb_to_lightness_(
          ??const?double?re,?const?double?gr,?const?double?bl,?double?&li)
          {
          ??li=((re?<?gr)???((gr?<?bl)???bl?:?gr)?:?((re?<?bl)???bl?:?re)?+
          ????????????????????????????(gr?<?re)
          ????????????????????????????((bl?<?gr)???bl?:?gr)
          ??????????????????????????:?((bl?<?re)???bl?:?re))?/?2.0;
          }

          說白了就是真實的代碼工程中,大家見到過大量三元運算符濫用的場景,紛紛給出了大量的難理解的例子,讓大家困擾不堪。

          總結(jié)

          在這篇文章中,首先針對 “三元運算符” 做了基本的介紹。緊接著根據(jù) Go 語言不支持三元的態(tài)度進行了說明,且面向社區(qū)的爭議我們分為了正反方面的基本詮釋。

          實際上一個簡單的 ?: 既整潔又實用,但是沒有很好又高效的辦法方法可以防止丑陋的嵌套,也就是排除可讀性的問題。

          在真實的業(yè)務(wù)工程中,常常能看到一個三元運算符,一開始只是很簡單。后面嵌套越加越深,邏輯越寫越復(fù)雜,從而帶來了許多維護上的問題。

          給大家拋出如下問題:

          • 你認(rèn)為 Go 語言是否要有三元運算符呢?
          • 如果要有,復(fù)雜嵌套的三元運算符又如何考慮呢?


          本篇文章轉(zhuǎn)載自魚哥的公眾號,強烈推薦大家前往關(guān)注


          參考

          • What is the idiomatic Go equivalent of C's ternary operator?
          • What is the reasoning behind Go not having a ternary conditional operator?
          • Should Go have a Ternary Operator? Or was it left out intentionally?
          • We don't need a ternary operator

          ? ?

          e9d2a27747bb77b93f3c2ba439062765.webp
          喜歡明哥文章的同學(xué)歡迎長按下圖訂閱!

          ???


          瀏覽 45
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久久精品无码电影 | 在线观看亚洲视频 | 先锋影音av网址导航 | 亚洲婷色五月 | 日产无码 |