校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

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

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

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

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

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中不存在?這個運算符,編譯器不認識而且非字母數字下劃線也不能用做變量名,自然也就當作是非法字符了。

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

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

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

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

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秒細看可能沒法理清控制流程(想象一下當縮進錯位或是完全沒有縮進的時候)。

如果把它們直接轉化成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來清除嵌套結構:

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

現在再來看,顯然使用if語句的版本的可讀性更高,邏輯也更清晰(通過去除嵌套)。

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

const val = expr ? trueValue : falseValue

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

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

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

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

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

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

  return b
}

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

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

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

最后總結一下:

三元運算符的優點:

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

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

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

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

參考

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

總結

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

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

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

巨人網絡通訊聲明:本文標題《golang中為什么不存在三元運算符詳解》,本文關鍵詞  golang,中,為什么,不存在,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang中為什么不存在三元運算符詳解》相關的同類信息!
  • 本頁收集關于golang中為什么不存在三元運算符詳解的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    欧美一区二区久久| 欧美午夜不卡视频| 老司机精品视频导航| 一区二区三区四区蜜桃 | 91麻豆精品国产自产在线观看一区 | 日本欧美一区二区在线观看| 亚洲va欧美va国产va天堂影院| 亚洲欧美激情小说另类| 亚洲欧美欧美一区二区三区| 伊人色综合久久天天人手人婷| ...中文天堂在线一区| 亚洲欧美一区二区久久| 一区二区三区蜜桃| 午夜成人免费视频| 免费观看在线综合色| 九九**精品视频免费播放| 国产精品一区二区三区四区| 国产v日产∨综合v精品视频| 成人av一区二区三区| 色婷婷一区二区三区四区| 欧美色图在线观看| 日韩一区二区三免费高清| 日韩一区二区三区观看| 国产亚洲成av人在线观看导航| 中文字幕国产精品一区二区| 亚洲精品国产第一综合99久久 | 粉嫩绯色av一区二区在线观看| 国产91精品一区二区麻豆亚洲| 成人免费看黄yyy456| 色婷婷久久久久swag精品 | 成人伦理片在线| 欧美综合一区二区| 久久一区二区三区四区| 亚洲欧美日韩久久| 日韩影院在线观看| 国产不卡免费视频| 欧美日本一区二区三区| 国产欧美日韩视频在线观看| 亚洲一区二区三区在线播放| 精品一二三四区| 色综合色综合色综合色综合色综合 | 国产最新精品免费| 欧美少妇性性性| 久久天天做天天爱综合色| 一区二区三区在线播放| 国产一区二区三区在线观看免费视频| 99精品热视频| 久久亚洲二区三区| 日韩精品久久久久久| 99久久婷婷国产综合精品| 日韩一区二区三区免费看 | 激情国产一区二区| 一本大道久久a久久精二百| 91精品免费在线| 亚洲你懂的在线视频| 国产一区二区影院| 欧美一级一区二区| 亚洲福利一区二区| 色综合久久综合网97色综合| 精品欧美一区二区在线观看| 香蕉久久夜色精品国产使用方法| 国产成人精品综合在线观看| 日韩视频在线一区二区| 亚洲精品成a人| 91丨九色porny丨蝌蚪| 久久精品亚洲精品国产欧美kt∨| 免费在线观看一区| 日韩欧美电影一区| 人人超碰91尤物精品国产| 91行情网站电视在线观看高清版| 综合激情网...| 成人av网址在线观看| 久久男人中文字幕资源站| 久久精品国产**网站演员| 91精品福利在线一区二区三区| 亚洲一区二区精品3399| 欧美日韩综合一区| 亚洲v日本v欧美v久久精品| 欧美私模裸体表演在线观看| 亚洲精品日韩一| 91日韩一区二区三区| 亚洲人成网站色在线观看| 色综合天天综合网天天狠天天| 中文字幕第一区第二区| 国产在线视频一区二区| 久久这里都是精品| 成人亚洲精品久久久久软件| 国产精品天天看| 色综合久久久久综合体桃花网| 亚洲一区二区精品视频| 欧美精品色一区二区三区| 日韩电影一二三区| 久久―日本道色综合久久| 成人理论电影网| 亚洲成a人片在线观看中文| 在线不卡免费av| 国产精品中文字幕日韩精品| 中文字幕欧美一| 欧洲国内综合视频| 免费成人在线网站| 国产色产综合色产在线视频| 99久久综合国产精品| 亚洲综合一区二区精品导航| 欧美一区二区美女| 成人黄色av电影| 午夜私人影院久久久久| 欧美精品一区二区三区一线天视频| 国产suv精品一区二区6| 夜夜爽夜夜爽精品视频| 欧美大度的电影原声| 91女厕偷拍女厕偷拍高清| 蜜臀a∨国产成人精品| 亚洲欧洲精品一区二区三区 | 国产精品99久久久久久似苏梦涵| 《视频一区视频二区| 日韩一区二区在线观看| 91在线一区二区三区| 视频一区欧美精品| 欧美国产成人在线| 欧美视频在线观看一区二区| 国产成人av电影在线观看| 亚洲国产cao| 亚洲欧洲成人精品av97| 在线成人午夜影院| 国内精品在线播放| 日韩免费高清电影| 欧美亚洲免费在线一区| 国内不卡的二区三区中文字幕| 国产精品色哟哟网站| 99精品视频中文字幕| 天天操天天综合网| 国产精品久久久久精k8| 日韩欧美区一区二| 91蝌蚪porny九色| 精品在线亚洲视频| 亚洲一区二区三区四区在线观看 | 国产精品久久久久影院老司| 欧美亚洲综合网| 国产精品亚洲第一| 视频一区视频二区中文| 国产精品久久久久7777按摩| 久久青草欧美一区二区三区| 欧美亚洲国产怡红院影院| 国内外成人在线视频| 亚洲国产精品欧美一二99| 久久久91精品国产一区二区三区| 日韩午夜中文字幕| 色妹子一区二区| 国产激情一区二区三区四区| 秋霞电影一区二区| 亚洲女与黑人做爰| 亚洲精品ww久久久久久p站| 久久久国产精华| 日韩精品专区在线影院观看| 91福利社在线观看| 国产在线视频一区二区| 国产美女一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲综合在线电影| 亚洲天堂免费在线观看视频| 国产精品久久久久久久蜜臀| 国产香蕉久久精品综合网| 欧美一区日韩一区| 6080yy午夜一二三区久久| 97精品超碰一区二区三区| 91丨porny丨蝌蚪视频| 成人短视频下载| 国产风韵犹存在线视精品| 国产一区福利在线| 国产一区二区三区四区五区美女 | 国产调教视频一区| 久久久精品免费网站| 欧美乱妇20p| 久久久亚洲高清| 欧美极品另类videosde| 国产精品毛片无遮挡高清| www国产精品av| 亚洲欧洲精品一区二区精品久久久| 国产精品高潮呻吟| 亚洲综合色婷婷| 一区二区三区四区视频精品免费| 免费欧美日韩国产三级电影| 美女mm1313爽爽久久久蜜臀| 久久9热精品视频| 国产一区二区不卡在线| 色婷婷精品大在线视频| 欧美丝袜丝交足nylons图片| 91麻豆精品国产91久久久久久| 91精品国产色综合久久| 欧美国产欧美综合| 亚洲欧美色一区| 蜜桃av一区二区| 国产精品一区二区在线播放| 欧美无乱码久久久免费午夜一区| 在线不卡中文字幕播放| 国产午夜精品一区二区三区嫩草| 国产精品护士白丝一区av| 久久99国产精品麻豆| 成人爱爱电影网址| 成人在线视频一区二区|