自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么我不會(huì)舍棄Python投奔Go語言

開發(fā) 開發(fā)工具 前端
作者Russ Cox畢業(yè)于麻省理工和哈佛大學(xué),曾在貝爾實(shí)驗(yàn)室參與過Plan 9 和 Unix操作系統(tǒng)的開發(fā),最近在google,主要開發(fā)Go語言。最近關(guān)于Go語言的話題很多,本月剛好是Go語言誕生3周年。這個(gè)語言在谷歌巨人的推動(dòng)下最終很可能成為今后的主流語言。

最近,由于一篇“為什么我不會(huì)舍棄Python投奔Go語言(英文)”的博客,我收到了大量的郵件,這篇文章中,作者說Go語言除了“用返回值來處理異常錯(cuò)誤”這點(diǎn)外,其它的都非常好。我想寫出一點(diǎn)東西,解釋一下Go語言為什么這樣做,這會(huì)對(duì)大家都有用。

[[103021]] 
本文作者:Russ Cox

在Go語言中,規(guī)定的方式是,函數(shù)返回錯(cuò)誤信息。這沒什么。如果一個(gè)文件并不存在,op.Open函數(shù)會(huì)返回一個(gè)錯(cuò)誤信息。這沒什么。如果你向你一個(gè)中斷了的網(wǎng)絡(luò)連接里寫數(shù)據(jù),net.Conn里的Write方法會(huì)返回一個(gè)錯(cuò)誤。這沒什么。這種狀況在這種程序中是可以預(yù)料到的。這種操作就是容易失敗,你知道程序會(huì)如何運(yùn)行,因?yàn)锳PI的設(shè)計(jì)者通過內(nèi)置了一種錯(cuò)誤情況的結(jié)果而讓這一切顯得很清楚。

從另一方面講,有些操作基本上不會(huì)出錯(cuò),所處的環(huán)境根本不可能給你提示錯(cuò)誤信息,不可能控制錯(cuò)誤。這才是讓人痛苦的地方。典型的例子;一個(gè)程序執(zhí)行 x[j],j值超出數(shù)組邊界,這才痛苦。像這樣預(yù)料之外的麻煩在程序中是一個(gè)嚴(yán)重的bug,一般會(huì)弄死程序的運(yùn)行。不幸的是,由于這種情況的存在,我們很難寫出健壯的,具有自我防御的服務(wù)器——例如,可以應(yīng)付偶然出現(xiàn)的有bug的HTTP請(qǐng)求處理器時(shí),不影響其他服務(wù)的啟動(dòng)和運(yùn)行。為解決這個(gè)問題,我們引入了恢復(fù)機(jī)制,它能讓一個(gè)go例程從錯(cuò)誤中恢復(fù),服務(wù)余下設(shè)定的調(diào)用。然而,代價(jià)是,至少會(huì)丟失一個(gè)調(diào)用。這是特意而為之的。引用郵件中的原話:“這種設(shè)計(jì)不同于常見的異??刂平Y(jié)構(gòu),這是一個(gè)認(rèn)真思考后的決定。我們不希望像java語言里那樣把錯(cuò)誤和異常混為一談。”

我剛開始提到的那篇文章里問“為什么數(shù)組越界造成的麻煩會(huì)比錯(cuò)誤的網(wǎng)址或斷掉的網(wǎng)絡(luò)引出的問題要大?”答案是,我們沒有一種內(nèi)聯(lián)并行的方法來報(bào)告在執(zhí)行x[j]期間產(chǎn)生的錯(cuò)誤,但我們有內(nèi)聯(lián)并行的方法報(bào)告由錯(cuò)誤網(wǎng)址或網(wǎng)絡(luò)問題造成的錯(cuò)誤。

使用Go語言中的錯(cuò)誤返回模式的規(guī)則很簡單:如果你的函數(shù)在某種情況下很容易出錯(cuò),那它就應(yīng)該返回錯(cuò)誤。當(dāng)我調(diào)用其它的程序庫時(shí),如果它是這樣寫的,那我不必?fù)?dān)心那些錯(cuò)誤的產(chǎn)生,除非有真正異常的狀況,我根本沒有想到需要處理它們。

有一個(gè)你需要記在心里的事情是,Go語言是為大型軟件設(shè)計(jì)的。我們都喜歡程序簡潔清晰,但對(duì)于一個(gè)由很多程序員一起開發(fā)的大型軟件,維護(hù)成本的增加很難讓程序簡潔。異常捕捉模式的錯(cuò)誤處理方式的一個(gè)很有吸引力的特點(diǎn)是,它非常適合小程序。但對(duì)于大型程序庫,如果對(duì)于一些普通操作,你都需要考慮每行代碼是否會(huì)拋出異常、是否有必要捕捉處理,這對(duì)于開發(fā)效率和程序員的時(shí)間來說都是非常嚴(yán)重的拖累。我自己做開發(fā)大型Python軟件時(shí)感受到了這個(gè)問題。 Go語言的返回錯(cuò)誤方式,不可否認(rèn),對(duì)于調(diào)用者不是很方便,但這樣做會(huì)讓程序中可能會(huì)出錯(cuò)的地方顯的很明顯。對(duì)于小程序來說,你可能只想打印出錯(cuò)誤,退出程序。對(duì)于一些很精密的程序,根據(jù)異常的不同,來源的不同,程序會(huì)做出不同的反應(yīng),這很常見,這種情況中,try + catch的方式相對(duì)于錯(cuò)誤返回模式顯得冗長。當(dāng)然,Python里的一個(gè)10行的代碼放到Go語言里很可能會(huì)更冗長。畢竟,Go語言主要不是針對(duì)10行規(guī)模的程序的。

就是要說明這一點(diǎn):Go語言程序員認(rèn)為,把error作為一種內(nèi)置的類型是非常重要的。

附言

有時(shí),你會(huì)發(fā)現(xiàn),一種非本地的goto語句被當(dāng)作錯(cuò)誤恢復(fù)的方法,就像C語言里的longjmp 和 setjmp。這也不錯(cuò),但***只在內(nèi)部用。如果調(diào)用者需要知道錯(cuò)誤恢復(fù)的走向,那你的這種方式就不好了。

 

英文原文:Why Im not leaving Python for Go

譯文鏈接:http://www.aqee.net/response-to-why-im-not-leaving-python-for-go/

責(zé)任編輯:林師授 來源: 外刊IT評(píng)論
相關(guān)推薦

2020-09-04 15:34:07

C編程語言開發(fā)

2020-04-07 16:12:56

Go編程語言開發(fā)

2018-06-15 21:26:13

PythonCrystal語言

2018-05-02 12:34:48

2016-09-27 21:25:08

Go語言Ken Thompso

2024-01-02 10:38:22

Go語言數(shù)組

2019-11-18 09:56:48

谷歌Go語言開發(fā)者

2011-10-14 09:20:48

Lisp

2012-05-19 22:17:30

Android

2022-01-17 16:09:43

Go語言開發(fā)

2023-03-06 08:01:25

structGo語言

2021-02-09 20:51:13

D 語言腳本編程語言

2012-06-18 14:51:09

Python

2021-12-21 06:09:05

Python切片索引

2022-01-10 23:54:56

GoMap并發(fā)

2019-10-12 10:18:35

代碼開發(fā)Go

2014-12-26 09:56:50

編程語言

2018-12-28 15:30:15

PythonGo編程語言

2024-01-15 00:42:55

Go語言應(yīng)用程序

2024-01-01 08:10:40

Go語言map
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)