最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言為什么不支持三元運(yùn)算符原理解析

 更新時(shí)間:2023年08月07日 09:10:38   作者:煎魚  
這篇文章主要為大家介紹了Go語言為什么不支持三元運(yùn)算符原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

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

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

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

三元運(yùn)算符是什么

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

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

還有一元運(yùn)算符:

-a
~b
!c

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

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

Go 使用三元運(yùn)算符

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

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

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

為什么 Go 沒有三元運(yùn)算符

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

通過 Go FAQ 我們可以得知:

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

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

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

社區(qū)爭議

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

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

反對

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

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

同意

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

一般來講,我們用三元運(yù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)))

還能嵌套三元運(yùn)算符:

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;
}

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

總結(jié)

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

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

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

給大家拋出如下問題:

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

以上問題留給大家思考,更多關(guān)于Go 三元運(yùn)算符的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang語法使用的注意事項(xiàng)

    golang語法使用的注意事項(xiàng)

    這篇文章主要給大家介紹了關(guān)于golang語法使用的一些注意事項(xiàng),Golang是一種靜態(tài)類型的編程語言,它支持基本的數(shù)據(jù)類型,包括整型、浮點(diǎn)型、布爾型、字符串型,需要的朋友可以參考下
    2023-07-07
  • Go語言實(shí)現(xiàn)UDP協(xié)議及TCP通訊

    Go語言實(shí)現(xiàn)UDP協(xié)議及TCP通訊

    這篇文章介紹了Go語言實(shí)現(xiàn)UDP協(xié)議及TCP通訊的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • golang map的基本操作及定義方式

    golang map的基本操作及定義方式

    這篇文章主要介紹了golang-map的基本操作,由于map是引用類型,所以在操作的時(shí)候,必須先初始化,本文通過多種方式給大家講解map的定義方式,需要的朋友可以參考下
    2022-08-08
  • Go語言實(shí)現(xiàn)單例模式的多種方法

    Go語言實(shí)現(xiàn)單例模式的多種方法

    單例模式是一種創(chuàng)建型設(shè)計(jì)模式,Go中常見實(shí)現(xiàn)包括使用sync.Once、雙重檢查鎖定和原子操作法,每種方法都有其獨(dú)特的優(yōu)點(diǎn)和適用場景,下面就來具體介紹一下
    2025-07-07
  • Go語言壓縮和解壓縮tar.gz文件的方法

    Go語言壓縮和解壓縮tar.gz文件的方法

    這篇文章主要介紹了Go語言壓縮和解壓縮tar.gz文件的方法,實(shí)例分析了使用Go語言壓縮文件與解壓文件的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go get命令使用socket代理的方法

    Go get命令使用socket代理的方法

    由于某些不可描述的原因,國內(nèi)使用 go get 命令安裝某些包的時(shí)候會(huì)超時(shí)導(dǎo)致失敗,比如 net 包、 sys 包、 tools 包等。這篇文章給大家介紹go get 命令使用socket 代理的方法,感興趣的朋友一起看看吧
    2018-10-10
  • Go語言中的空值(nil)與零值(zerovalue)區(qū)別詳解

    Go語言中的空值(nil)與零值(zerovalue)區(qū)別詳解

    在Go語言中,空值(nil)和零值(zero value)是兩個(gè)不同的概念,它們在語義、使用場景以及實(shí)際的編程實(shí)踐中有著明顯的區(qū)別,理解這兩者的差異對于編寫清晰、健壯的Go代碼至關(guān)重要,需要的朋友可以參考下
    2024-06-06
  • go語言接口之接口值舉例詳解

    go語言接口之接口值舉例詳解

    接口是一種抽象類型,是對其他類型行為的概括與抽象,從語法角度來看,接口是一組方法定義的集合,下面這篇文章主要給大家介紹了關(guān)于go語言接口之接口值的相關(guān)資料,文章通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • Golang實(shí)現(xiàn)讀取excel文件并轉(zhuǎn)換為JSON格式

    Golang實(shí)現(xiàn)讀取excel文件并轉(zhuǎn)換為JSON格式

    本文介紹了如何使用Golang讀取Excel文件并將其轉(zhuǎn)換為JSON格式,通過安裝excelize依賴和創(chuàng)建readExcelToJSON方法,可以實(shí)現(xiàn)這一功能,如果需要轉(zhuǎn)換數(shù)據(jù)類型,可以修改相應(yīng)的代碼,需要的朋友可以參考下
    2025-03-03
  • 深度解密 Go 語言中的 sync.Pool

    深度解密 Go 語言中的 sync.Pool

    sync.Pool 是 sync 包下的一個(gè)組件,可以作為保存臨時(shí)取還對象的一個(gè)“池子”。這篇文章主要介紹了深度解密 Go 語言中的sync.Pool,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評論

临猗县| 五大连池市| 方城县| 云南省| 竹山县| 永宁县| 盐津县| 安庆市| 定结县| 松江区| 东阿县| 仁寿县| 桑日县| 大兴区| 辛集市| 娱乐| 互助| 东乌珠穆沁旗| 托克逊县| 三门县| 诸暨市| 乌审旗| 内丘县| 布拖县| 宜良县| 濮阳市| 汉沽区| 沙田区| 乐陵市| 浙江省| 卢龙县| 赤水市| 张家港市| 任丘市| 年辖:市辖区| 隆子县| 木兰县| 洪雅县| 屏东市| 聂拉木县| 锡林郭勒盟|