婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > golang中為什么不存在三元運(yùn)算符詳解

golang中為什么不存在三元運(yùn)算符詳解

熱門(mén)標(biāo)簽:長(zhǎng)沙ai機(jī)器人電銷(xiāo) 澳門(mén)防封電銷(xiāo)卡 智能電銷(xiāo)機(jī)器人營(yíng)銷(xiāo) 地圖標(biāo)注測(cè)試 福州鐵通自動(dòng)外呼系統(tǒng) 賺地圖標(biāo)注的錢(qián)犯法嗎 廣東語(yǔ)音外呼系統(tǒng)供應(yīng)商 濮陽(yáng)自動(dòng)外呼系統(tǒng)代理 烏魯木齊人工電銷(xiāo)機(jī)器人系統(tǒng)

三元運(yùn)算符廣泛存在于其他語(yǔ)言中,比如:

python:

val = trueValue if expr else falseValue

javascript:

const val = expr ? trueValue : falseValue

c、c++:

const char *val = expr ? "trueValue" : "falseValue";

然而,被廣泛支持的三目運(yùn)算符在golang中卻是不存在的!如果我們寫(xiě)出類(lèi)似下面的代碼:

val := expr ? "trueValue" : "falseValue"

那么編譯器就該抱怨了:invalid character U+003F '?'。意思是golang中不存在?這個(gè)運(yùn)算符,編譯器不認(rèn)識(shí)而且非字母數(shù)字下劃線也不能用做變量名,自然也就當(dāng)作是非法字符了。

然而這是為什么呢,其實(shí)官方給出了解釋?zhuān)@里簡(jiǎn)單引用一下:

The reason ?: is absent from Go is that the language's designers had seen the operation used too often to create impenetrably complex expressions. The if-else form, although longer, is unquestionably clearer. A language needs only one conditional control flow construct.

golang中不存在?:運(yùn)算符的原因是因?yàn)檎Z(yǔ)言設(shè)計(jì)者已經(jīng)預(yù)見(jiàn)到三元運(yùn)算符經(jīng)常被用來(lái)構(gòu)建一些極其復(fù)雜的表達(dá)式。雖然使用if進(jìn)行替代會(huì)讓代碼顯得更長(zhǎng),但這毫無(wú)疑問(wèn)可讀性更強(qiáng)。一個(gè)語(yǔ)言只需要有一種條件判斷結(jié)構(gòu)就足夠了。

毫無(wú)疑問(wèn),這是在golang“大道至簡(jiǎn)”的指導(dǎo)思想下的產(chǎn)物。

這段話其實(shí)沒(méi)問(wèn)題,因?yàn)槟承┤\(yùn)算符的使用場(chǎng)景確實(shí)會(huì)降低代碼的可讀性:

const status = (type===1?(agagin===1?'再售':'已售'):'未售')

const word = (res.distance === 0) ? 'a'
  : (res.distance === 1  res.difference > 3) ? 'b'
  : (res.distance === 2  res.difference > 5  String(res.key).length > 5) ? 'c'
  : 'd';

乍一看確實(shí)很復(fù)雜,至少第二個(gè)表達(dá)式不花個(gè)20秒細(xì)看可能沒(méi)法理清控制流程(想象一下當(dāng)縮進(jìn)錯(cuò)位或是完全沒(méi)有縮進(jìn)的時(shí)候)。

如果把它們直接轉(zhuǎn)化成if語(yǔ)句是這樣的:

let status = ''
if (type === 1) {
  if (again === 1) {
    status = '再售'
  } else {
    status = '已售'
  }
} else {
  status = '未售'
}

let word = ''
if (res.distance === 0) {
  word = 'a'
} else {
  if (res.distance === 1  res.difference > 3) {
    word = 'b'
  } else {
    if (res.distance === 2  res.difference > 5  String(res.key).length > 5) {
      word = 'c'
    } else {
      word = 'd'
    }
  }
}

看起來(lái)并沒(méi)有多少的改善,特別是例2,三層嵌套,不管是誰(shuí)review到這段代碼難免不會(huì)抱怨你幾句。

然而事實(shí)上這些代碼是可以簡(jiǎn)化的,考慮到三元運(yùn)算符總是會(huì)給變量一個(gè)值,因此最后的else其實(shí)可以看作是變量的默認(rèn)值,于是代碼可以這么寫(xiě):

let status = '未售'
if (type === 1) {
  if (again === 1) {
    status = '再售'
  } else {
    status = '已售'
  }
}

let word = 'd'
if (res.distance === 0) {
  word = 'a'
} else {
  if (res.distance === 1  res.difference > 3) {
    word = 'b'
  } else {
    if (res.distance === 2  res.difference > 5  String(res.key).length > 5) {
      word = 'c'
    }
  }
}

其次,對(duì)于例2,顯然可以使用else if來(lái)清除嵌套結(jié)構(gòu):

let word = 'd'
if (res.distance === 0) {
  word = 'a'
} else if (res.distance === 1  res.difference > 3) {
  word = 'b'
} else if (res.distance === 2  res.difference > 5  String(res.key).length > 5) {
  word = 'c'
}

現(xiàn)在再來(lái)看,顯然使用if語(yǔ)句的版本的可讀性更高,邏輯也更清晰(通過(guò)去除嵌套)。

然而事實(shí)也不盡然。除了用三元運(yùn)算符表達(dá)流程控制之外,事實(shí)上更常見(jiàn)更廣泛的一個(gè)應(yīng)用是如下這樣的表達(dá)式:

const val = expr ? trueValue : falseValue

const func = (age) => age > 18 ? '成年人' : '未成年人'

類(lèi)似上述通過(guò)一個(gè)簡(jiǎn)短的條件表達(dá)式來(lái)確定變量的值,在開(kāi)發(fā)中的出現(xiàn)頻率是相當(dāng)高的。這時(shí)三元運(yùn)算符的意圖更清晰,可讀性也較if語(yǔ)句更高,特別是配合匿名函數(shù)(lambda表達(dá)式)使用可以極大簡(jiǎn)化我們的代碼。

對(duì)此python的解決之道是之支持上述的簡(jiǎn)化版三元表達(dá)式,同時(shí)表達(dá)式不支持嵌套,達(dá)到了揚(yáng)長(zhǎng)避短的目的。不過(guò)代價(jià)是編譯器的相關(guān)實(shí)現(xiàn)會(huì)復(fù)雜化。

而對(duì)于golang來(lái)說(shuō)一個(gè)簡(jiǎn)單的能只通過(guò)單遍掃描即可完成ast構(gòu)建的編譯器是其保持急速的構(gòu)建速度的秘訣之一,為了這樣簡(jiǎn)單的功能增加編譯器實(shí)現(xiàn)的復(fù)雜度是不可接受的。同時(shí)由于golang“大道至簡(jiǎn)”的哲學(xué),能用現(xiàn)有語(yǔ)法結(jié)構(gòu)解決的問(wèn)題,自然不會(huì)再添加新的語(yǔ)法。

不過(guò)還是有辦法的,雖然不推薦:

func If(cond bool, a, b interface{}) {
  if cond {
    return a
  }

  return b
}

age := 20
val := If(age > 18, "成年人", "未成年人").(string)

不推薦這么做是有幾個(gè)原因:

  1. 使用接口導(dǎo)致性能下降
  2. 需要強(qiáng)制的類(lèi)型斷言
  3. 不管三元表達(dá)式還是if語(yǔ)句,對(duì)于不會(huì)到達(dá)的分支是不會(huì)計(jì)算的,也就是惰性計(jì)算;而給函數(shù)傳遞參數(shù)時(shí)每一個(gè)表達(dá)式都會(huì)被計(jì)算

最后總結(jié)一下:

三元運(yùn)算符的優(yōu)點(diǎn):

  • 對(duì)于簡(jiǎn)短的表達(dá)式使用三元運(yùn)算符表意更清晰,特別是在習(xí)慣了線性閱讀三元運(yùn)算符表達(dá)式之后
  • 不需要中間狀態(tài)(例如第一個(gè)例子中的let變量可以替換為const,代碼更健壯),心智負(fù)擔(dān)更低
  • 沒(méi)有中間狀態(tài)也就意味著更少或完全沒(méi)有副作用,代碼更易跟蹤和維護(hù)

但三元運(yùn)算符也有明顯的缺點(diǎn):

  • 對(duì)于復(fù)雜邏輯代碼可讀性較差(例如第一個(gè)例子中的status,需要在trueValue的位置進(jìn)行進(jìn)一步的條件判斷時(shí))
  • 容易被濫用,很多人將其用于替代if語(yǔ)句或是簡(jiǎn)化復(fù)雜的if嵌套,這會(huì)導(dǎo)致上一條中所描述的結(jié)果
  • 條件分支只能為表達(dá)式,不支持多條語(yǔ)句

所以這是一個(gè)見(jiàn)仁見(jiàn)智的問(wèn)題,總之只能入鄉(xiāng)隨俗了。

參考

https://juejin.im/post/6844903561759850510

https://www.it-swarm.dev/zh/javascript/替代js中的嵌套三元運(yùn)算符/1055944752/

https://golang.org/doc/faq#Does_Go_have_a_ternary_form

總結(jié)

到此這篇關(guān)于golang中為什么不存在三元運(yùn)算符的文章就介紹到這了,更多相關(guān)golang不存在三元運(yùn)算符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Golang 運(yùn)算符及位運(yùn)算詳解
  • Go語(yǔ)言運(yùn)算符案例講解
  • 手把手帶你走進(jìn)Go語(yǔ)言之運(yùn)算符解析

標(biāo)簽:西雙版納 調(diào)研邀請(qǐng) 德州 太原 阿克蘇 廣西 慶陽(yáng) 貴陽(yáng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang中為什么不存在三元運(yùn)算符詳解》,本文關(guān)鍵詞  golang,中,為什么,不存在,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang中為什么不存在三元運(yùn)算符詳解》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于golang中為什么不存在三元運(yùn)算符詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产91精品免费| 福利一区在线观看| 国产日韩v精品一区二区| 在线免费观看成人短视频| 经典三级在线一区| 亚洲国产aⅴ天堂久久| 国产精品另类一区| 精品国产一二三区| 在线国产亚洲欧美| www.综合网.com| 国产精品综合av一区二区国产馆| 亚洲gay无套男同| 亚洲欧洲成人自拍| 日本一区二区三区国色天香 | 亚洲国产成人一区二区三区| 欧美精品xxxxbbbb| 91传媒视频在线播放| 99vv1com这只有精品| 成人手机在线视频| 国产精品香蕉一区二区三区| 裸体一区二区三区| 日本不卡一二三区黄网| 亚洲成人久久影院| 亚洲一区二区三区中文字幕在线| 亚洲欧美日韩国产一区二区三区| 国产偷国产偷亚洲高清人白洁| 欧美一级二级三级蜜桃| 91精品国产全国免费观看| 欧美无乱码久久久免费午夜一区| 色欧美片视频在线观看 | 欧美精品久久久久久久多人混战| 一本色道久久综合狠狠躁的推荐| 成人黄色av电影| 成人免费毛片片v| 成人综合日日夜夜| www.综合网.com| 91麻豆福利精品推荐| 91免费版pro下载短视频| 91在线小视频| 欧美性大战久久久| 欧美日韩精品系列| 欧美一级视频精品观看| 欧美不卡一区二区三区| 久久久精品黄色| 国产精品私房写真福利视频| 国产精品福利一区二区三区| 亚洲欧美色一区| 亚洲一区二区三区小说| 午夜伦欧美伦电影理论片| 婷婷开心激情综合| 久久精品国产亚洲一区二区三区| 久久精品国产第一区二区三区| 久久精品国产精品亚洲综合| 国产成人自拍高清视频在线免费播放 | 国产亚洲一区二区三区在线观看 | 99久久综合国产精品| 91免费版pro下载短视频| 欧美日韩一区二区在线观看| 欧美日韩国产区一| 精品国产成人在线影院| 国产精品国产三级国产专播品爱网 | 亚洲精品欧美综合四区| 亚洲国产精品久久久久婷婷884| 日韩av中文字幕一区二区| 极品少妇xxxx精品少妇| 成人福利视频网站| 欧美日韩成人在线一区| 欧美精品一区二区三区四区| 亚洲欧洲国产日本综合| 五月激情综合婷婷| 国产精品一区二区在线播放| 99精品视频在线播放观看| 69堂成人精品免费视频| 亚洲国产精品成人综合色在线婷婷| 亚洲免费资源在线播放| 理论电影国产精品| 色美美综合视频| 2014亚洲片线观看视频免费| 亚洲男人天堂av网| 国产真实乱对白精彩久久| 99视频一区二区| 欧美不卡在线视频| 亚洲一区在线视频| 东方欧美亚洲色图在线| 91精品婷婷国产综合久久| 国产精品国产三级国产a| 日韩和欧美一区二区三区| 成人午夜视频网站| 欧美日韩1区2区| 国产精品电影院| 久久精品国产精品亚洲综合| 欧美主播一区二区三区| 欧美国产成人在线| 久久精品二区亚洲w码| 在线免费观看一区| 中文字幕一区二区不卡| 国产在线不卡视频| 91精品国产综合久久香蕉麻豆| 18欧美亚洲精品| 高清成人免费视频| 亚洲精品一线二线三线无人区| 亚洲国产乱码最新视频| 91浏览器打开| 中文字幕精品在线不卡| 精品一区二区三区在线观看国产 | 成人免费视频播放| 日韩欧美国产一区在线观看| 亚洲午夜影视影院在线观看| 99视频在线精品| 国产精品色眯眯| 国产精品资源在线| 精品电影一区二区三区| 日本欧美在线观看| 欧美日本视频在线| 一区二区三区影院| 99在线视频精品| 国产精品久久久久久久蜜臀| 国产成人综合视频| 久久精品日产第一区二区三区高清版| 日本欧美一区二区| 日韩欧美一级片| 日韩av一二三| 日韩欧美一区二区三区在线| 午夜a成v人精品| 6080日韩午夜伦伦午夜伦| 天堂成人免费av电影一区| 欧美无砖砖区免费| 天天免费综合色| 91精品国产综合久久小美女| 日本v片在线高清不卡在线观看| 欧美日韩一卡二卡| 午夜精品久久久久久| 在线成人av网站| 奇米色一区二区三区四区| 欧美一区2区视频在线观看| 老司机精品视频在线| 精品国产99国产精品| 国内成人自拍视频| 国产欧美综合色| 99在线精品观看| 亚洲一区免费在线观看| 91精选在线观看| 久久99热99| 久久久电影一区二区三区| 成人黄色777网| 亚洲综合一区二区精品导航| 欧美疯狂性受xxxxx喷水图片| 日本欧美在线观看| 久久久天堂av| 91小宝寻花一区二区三区| 亚洲欧美日韩久久| 精品视频一区二区三区免费| 日本免费在线视频不卡一不卡二| 午夜欧美在线一二页| 成人在线视频一区| 玉米视频成人免费看| 欧美三级日本三级少妇99| 男人的天堂久久精品| 久久久99精品免费观看| 99r国产精品| 男人的天堂久久精品| 久久伊99综合婷婷久久伊| av欧美精品.com| 视频一区二区三区入口| 欧美精品一区二区三区蜜桃| 成人福利视频在线看| 亚州成人在线电影| 久久精品视频在线看| 色诱视频网站一区| 蜜臀av一区二区在线观看| 久久久亚洲午夜电影| 欧美在线高清视频| 激情另类小说区图片区视频区| 最新久久zyz资源站| 欧美精品日韩一本| 成人美女在线观看| 日韩精品1区2区3区| 成人欧美一区二区三区小说| 日韩欧美一级在线播放| 91麻豆高清视频| 国产一区二区91| 亚洲va欧美va人人爽午夜| 成人动漫一区二区三区| 国产日产欧美精品一区二区三区| 色噜噜狠狠色综合欧洲selulu| 麻豆成人免费电影| 亚洲麻豆国产自偷在线| 欧美精品一区二区三区蜜臀| 日本乱码高清不卡字幕| 久久99热这里只有精品| 一区二区三区在线观看动漫| 国产亚洲一区二区三区在线观看| 欧美日韩一区不卡| 91一区二区在线| 国产精品夜夜嗨| 九色porny丨国产精品| 舔着乳尖日韩一区| 亚洲一区在线观看免费观看电影高清| 国产日韩欧美一区二区三区乱码| 日韩三级在线观看|