欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > golang中為什么不存在三元運算符詳解

golang中為什么不存在三元運算符詳解

熱門標簽:長沙ai機器人電銷 澳門防封電銷卡 智能電銷機器人營銷 地圖標注測試 福州鐵通自動外呼系統(tǒng) 賺地圖標注的錢犯法嗎 廣東語音外呼系統(tǒng)供應商 濮陽自動外呼系統(tǒng)代理 烏魯木齊人工電銷機器人系統(tǒng)

三元運算符廣泛存在于其他語言中,比如:

python:

val = trueValue if expr else falseValue

javascript:

const val = expr ? trueValue : falseValue

c、c++:

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

然而,被廣泛支持的三目運算符在golang中卻是不存在的!如果我們寫出類似下面的代碼:

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

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

然而這是為什么呢,其實官方給出了解釋,這里簡單引用一下:

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中不存在?:運算符的原因是因為語言設計者已經(jīng)預見到三元運算符經(jīng)常被用來構(gòu)建一些極其復雜的表達式。雖然使用if進行替代會讓代碼顯得更長,但這毫無疑問可讀性更強。一個語言只需要有一種條件判斷結(jié)構(gòu)就足夠了。

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

這段話其實沒問題,因為某些三元運算符的使用場景確實會降低代碼的可讀性:

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

乍一看確實很復雜,至少第二個表達式不花個20秒細看可能沒法理清控制流程(想象一下當縮進錯位或是完全沒有縮進的時候)。

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

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

看起來并沒有多少的改善,特別是例2,三層嵌套,不管是誰review到這段代碼難免不會抱怨你幾句。

然而事實上這些代碼是可以簡化的,考慮到三元運算符總是會給變量一個值,因此最后的else其實可以看作是變量的默認值,于是代碼可以這么寫:

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

其次,對于例2,顯然可以使用else if來清除嵌套結(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)在再來看,顯然使用if語句的版本的可讀性更高,邏輯也更清晰(通過去除嵌套)。

然而事實也不盡然。除了用三元運算符表達流程控制之外,事實上更常見更廣泛的一個應用是如下這樣的表達式:

const val = expr ? trueValue : falseValue

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

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

對此python的解決之道是之支持上述的簡化版三元表達式,同時表達式不支持嵌套,達到了揚長避短的目的。不過代價是編譯器的相關(guān)實現(xiàn)會復雜化。

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

不過還是有辦法的,雖然不推薦:

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

  return b
}

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

不推薦這么做是有幾個原因:

  1. 使用接口導致性能下降
  2. 需要強制的類型斷言
  3. 不管三元表達式還是if語句,對于不會到達的分支是不會計算的,也就是惰性計算;而給函數(shù)傳遞參數(shù)時每一個表達式都會被計算

最后總結(jié)一下:

三元運算符的優(yōu)點:

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

但三元運算符也有明顯的缺點:

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

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

參考

https://juejin.im/post/6844903561759850510

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

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

總結(jié)

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

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

標簽:西雙版納 調(diào)研邀請 德州 太原 阿克蘇 廣西 慶陽 貴陽

巨人網(wǎng)絡通訊聲明:本文標題《golang中為什么不存在三元運算符詳解》,本文關(guān)鍵詞  golang,中,為什么,不存在,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang中為什么不存在三元運算符詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang中為什么不存在三元運算符詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    国产酒店精品激情| 我不卡一区二区| 欧洲一区二区三区免费视频| 久久天天做天天爱综合色| 日韩主播视频在线| 欧美一区二区免费在线观看| 欧美性大战久久久久久久 | 精品日产卡一卡二卡麻豆| 性欧美疯狂xxxxbbbb| gogo亚洲国模私拍人体| 色婷婷国产精品| 18欧美亚洲精品| 99视频热这里只有精品免费| 97成人资源站| 亚洲欧洲精品天堂一级| 99久久99久久精品国产片果冻| 色综合天天综合网国产成人综合天 | 国产精品乱人伦| 国产91丝袜在线观看| 亚洲天堂黄色片| 综合色天天鬼久久鬼色| 91色.com| 欧美日本韩国一区| 天天综合色天天| 久久久久麻豆v国产精华液好用吗| 欧美中文字幕一二三区视频| 亚洲无线码一区二区三区| 蜜臀久久99精品久久久久久9| 日韩 中文字幕| 精品免费国产一区二区三区四区| 卡一卡二国产精品| 亚洲av熟女国产一区二区性色| 久久久久久久久久美女| 国产成人亚洲精品青草天美| 色婷婷在线视频观看| 亚洲裸体xxx| 北京富婆泄欲对白| 精品成人佐山爱一区二区| 国产一区二区h| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 成人一区二区三区在线观看 | 国内精品久久久久影院一蜜桃| 可以免费看av的网址| 自拍偷拍亚洲激情| 亚洲图片欧美另类| 26uuu欧美日本| 岛国精品在线观看| 欧美日韩视频不卡| 免费精品视频在线| 五月综合色婷婷| 亚洲免费av网站| 人妻少妇精品视频一区二区三区| 久久亚洲精精品中文字幕早川悠里 | 国产婷婷色一区二区三区| 国产又黄又嫩又滑又白| 一区二区三区在线播| 777xxx欧美| 91人妻一区二区| 石原莉奈一区二区三区在线观看| 欧美日韩高清一区二区不卡| 91蜜桃免费观看视频| 在线观看国产日韩| 国产亚洲精品福利| 91亚洲资源网| 日韩欧美国产电影| 成人av小说网| 日韩一区二区精品在线观看| 国产v综合v亚洲欧| 91精品国产综合久久小美女| 国产成人综合自拍| 9191久久久久久久久久久| 国产在线播精品第三| 欧美午夜精品理论片a级按摩| 蜜臀av一级做a爰片久久| 岛国毛片在线观看| 免费观看成人鲁鲁鲁鲁鲁视频| 在线观看美女av| 日韩国产精品91| 一本大道久久精品懂色aⅴ| 美女看a上一区| 欧美性生活影院| 国产精品亚洲综合一区在线观看| 欧美丰满美乳xxx高潮www| 国产成人免费视频精品含羞草妖精 | 成人av午夜影院| 欧美精品一区二区三区高清aⅴ | 人妻在线日韩免费视频| 国产精品毛片久久久久久| 久久精品一区二区免费播放| 亚洲欧美福利一区二区| 极品人妻videosss人妻| 亚洲超丰满肉感bbw| 色一情一伦一子一伦一区| 狠狠色丁香久久婷婷综合_中| 欧美日韩黄色影视| 成人国产精品免费观看动漫 | 日韩午夜av一区| 91无套直看片红桃| 欧美激情一区二区三区| 国产精品jizz| 亚洲成人av在线电影| 色综合天天视频在线观看 | 蜜桃视频免费观看一区| 欧美图区在线视频| 波多野结衣中文字幕一区| 久久综合一区二区| 精品中文字幕在线播放| 亚洲综合色成人| www.99re7| 国产精品18久久久久久久久| 精品福利av导航| 免费在线观看你懂的| 亚洲电影中文字幕在线观看| 一本色道久久综合亚洲aⅴ蜜桃| 国产精品综合一区二区三区| 精品少妇一区二区三区免费观看| 国产大尺度视频| 一区二区三区欧美亚洲| 在线亚洲免费视频| av欧美精品.com| 1000精品久久久久久久久| 艳妇荡乳欲伦69影片| 国产精品一级片在线观看| 欧美精品一区二区三区一线天视频| 91视频啊啊啊| 日韩国产在线一| 日韩欧美国产一区二区在线播放 | 7777精品伊人久久久大香线蕉超级流畅| 99精品热视频| 亚洲欧洲综合另类在线| 色综合久久久久综合99| 99精品久久99久久久久| 亚洲欧美日韩国产中文在线| 日本高清成人免费播放| 91丝袜国产在线播放| 一区二区久久久久| 精品视频一区二区不卡| 免费看黄色片的网站| 午夜国产不卡在线观看视频| 欧美一区二区在线免费播放| 网站免费在线观看| 免费观看成人鲁鲁鲁鲁鲁视频| 精品国产凹凸成av人导航| 成年人免费观看视频网站| 国产中文一区二区三区| 亚洲国产精品精华液ab| 日本黄色小说视频| 中国特级黄色片| 午夜免费欧美电影| 日韩视频在线永久播放| 国产美女永久免费无遮挡 | 91精品福利在线一区二区三区 | 久久电影网站中文字幕 | 亚洲精品一区二区三区99| 少妇精品无码一区二区免费视频 | 精品无人码麻豆乱码1区2区| 久久精品日韩一区二区三区| 手机在线免费看毛片| 91网站在线观看视频| 午夜精品在线视频一区| 精品久久国产字幕高潮| 强制高潮抽搐sm调教高h| 不卡电影一区二区三区| 亚洲成人手机在线| 精品三级在线观看| 中文字幕电影av| 91热门视频在线观看| 午夜成人免费电影| 久久久亚洲欧洲日产国码αv| 粉嫩av性色av蜜臀av网站| 欧美一级大片免费看| 免费精品99久久国产综合精品| 亚洲国产精品成人综合| 欧美性生活大片视频| 蜜桃传媒一区二区亚洲av| 国产精品白丝jk黑袜喷水| 一区二区高清视频在线观看| 日韩欧美电影一区| 91porn在线视频| 黑丝av在线播放| 成人国产精品免费观看| 日韩专区在线视频| 中文字幕在线不卡视频| 91精品在线一区二区| 亚洲精品久久久久久国| 娇妻高潮浓精白浆xxⅹ| 国产高清不卡二三区| 亚洲成人久久影院| 欧美激情在线观看视频免费| 精品1区2区3区| 懂色av蜜臀av粉嫩av永久| 一级全黄裸体片| 国产精品一区在线| 五月天中文字幕一区二区| 中文字幕av一区 二区| 91精品麻豆日日躁夜夜躁| 2025国产精品自拍| 国产肥白大熟妇bbbb视频| 人妻少妇偷人精品久久久任期| 久久电影国产免费久久电影|