這篇文章主要介紹了go是不是解釋型語(yǔ)言,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
十余年的新都網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整新都建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“新都網(wǎng)站設(shè)計(jì)”,“新都網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
go是解釋型語(yǔ)言。Go(又稱Golang)是Google開發(fā)的一種靜態(tài)強(qiáng)類型、編譯型、并發(fā)型,并具有垃圾回收功能的編程語(yǔ)言。go語(yǔ)言的優(yōu)勢(shì):學(xué)習(xí)曲線容易,開發(fā)效率和運(yùn)行效率高,強(qiáng)大的標(biāo)準(zhǔn)庫(kù),語(yǔ)言層面定義源代碼的格式化等。
Go(又稱 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 開發(fā)的一種靜態(tài)強(qiáng)類型、編譯型語(yǔ)言。
Go的語(yǔ)法接近C語(yǔ)言,但對(duì)于變量的聲明有所不同。Go支持垃圾回收功能。Go的并行模型是以東尼·霍爾的通信順序進(jìn)程(CSP)為基礎(chǔ),采取類似模型的其他語(yǔ)言包括Occam和Limbo,但它也具有Pi運(yùn)算的特征,比如通道傳輸。在1.8版本中開放插件(Plugin)的支持,這意味著現(xiàn)在能從Go中動(dòng)態(tài)加載部分函數(shù)。
與C++相比,Go并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數(shù)等功能,但增加了 切片(Slice) 型、并發(fā)、管道、垃圾回收、接口(Interface)等特性的語(yǔ)言級(jí)支持。Go 2.0版本將支持泛型,對(duì)于斷言的存在,則持負(fù)面態(tài)度,同時(shí)也為自己不提供類型繼承來(lái)辯護(hù)。
不同于Java,Go內(nèi)嵌了關(guān)聯(lián)數(shù)組(也稱為哈希表(Hashes)或字典(Dictionaries)),就像字符串類型一樣。
Go語(yǔ)言的優(yōu)點(diǎn)
Go 很容易學(xué)習(xí)
這是事實(shí):如果你了解任何一種編程語(yǔ)言,那么通過(guò)在「Go 語(yǔ)言之旅」學(xué)習(xí)幾個(gè)小時(shí)就能夠掌握 Go 的大部分語(yǔ)法,并在幾天后寫出你的第一個(gè)真正的程序。閱讀并理解 實(shí)效 Go 編程,瀏覽一下「包文檔」,玩一玩 Gorilla 或者 Go Kit 這樣的網(wǎng)絡(luò)工具包,然后你將成為一個(gè)相當(dāng)不錯(cuò)的 Go 開發(fā)者。
這是因?yàn)?Go 的首要目標(biāo)是簡(jiǎn)單。當(dāng)我開始學(xué)習(xí) Go,它讓我想起我第一次 發(fā)現(xiàn) Java:一個(gè)簡(jiǎn)單的語(yǔ)言和一個(gè)豐富但不臃腫的標(biāo)準(zhǔn)庫(kù)。對(duì)比當(dāng)前 Java 沉重的環(huán)境,學(xué)習(xí) Go 是一個(gè)耳目一新的體驗(yàn)。因?yàn)?Go 的簡(jiǎn)易性,Go 程序可讀性非常高,雖然錯(cuò)誤處理添加了一些麻煩(更多的內(nèi)容在下面)。
Go 語(yǔ)言的簡(jiǎn)單可能是錯(cuò)誤的。引用 Rob Pike 的話,簡(jiǎn)單既是復(fù)雜,我們會(huì)看到簡(jiǎn)單背后有很多的陷阱等著我們?nèi)ゲ?,極簡(jiǎn)主義會(huì)讓我們違背 DRY(Don't Repeat Yourself) 原則。
基于 goroutines 和 channels 的簡(jiǎn)單并發(fā)編程
Goroutines 可能是 Go 的最佳特性了。它們是輕量級(jí)的計(jì)算線程,與操作系統(tǒng)線程截然不同。
當(dāng) Go 程序執(zhí)行看似阻塞 I/O 的操作時(shí),實(shí)際上 Go 運(yùn)行時(shí)掛起了 goroutine ,當(dāng)一個(gè)事件指示某個(gè)結(jié)果可用時(shí)恢復(fù)它。與此同時(shí),其他的 goroutines 已被安排執(zhí)行。因此在同步編程模型下,我們具有了異步編程的可伸縮性優(yōu)勢(shì)。
Goroutines 也是輕量級(jí)的:它們的堆棧 隨需求增長(zhǎng)和收縮,這意味著有 100 個(gè)甚至 1000 個(gè) goroutines 都不是問(wèn)題。
我以前的應(yīng)用程序中有一個(gè) goroutine 漏洞:這些 goroutines 結(jié)束之前正在等待一個(gè) channel 關(guān)閉,而這個(gè) channel 永遠(yuǎn)不會(huì)關(guān)閉(一個(gè)常見的死鎖問(wèn)題)。這個(gè)進(jìn)程毫無(wú)任何理由吃掉了 90 % 的 CPU ,而檢查 expvars 顯示有 600 k 空閑的 goroutines! 我猜測(cè) goroutine 調(diào)度程序占用了 CPU。
當(dāng)然,像 Akka 這樣的 Actor 系統(tǒng)可以輕松 處理數(shù)百萬(wàn)的 Actors,部分原因是 actors 沒(méi)有堆棧,但是他們遠(yuǎn)沒(méi)有像 goroutines 那樣簡(jiǎn)單地編寫大量并發(fā)的請(qǐng)求/響應(yīng)應(yīng)用程序(即 http APIs)。
channel 是 goroutines 的通信方式:它們提供了一個(gè)便利的編程模型,可以在 goroutines 之間發(fā)送和接收數(shù)據(jù),而不必依賴脆弱的低級(jí)別同步基本體。channels 有它們自己的一套 用法 模式。
但是,channels 必須仔細(xì)考慮,因?yàn)殄e(cuò)誤大小的 channels (默認(rèn)情況下沒(méi)有緩沖) 會(huì)導(dǎo)致死鎖。下面我們還將看到,使用通道并不能阻止競(jìng)爭(zhēng)情況,因?yàn)樗狈Σ豢勺冃浴?/p>
豐富的標(biāo)準(zhǔn)庫(kù)
Go 的 標(biāo)準(zhǔn)庫(kù) 非常豐富,特別是對(duì)于所有與網(wǎng)絡(luò)協(xié)議或 API 開發(fā)相關(guān)的: http 客戶端和服務(wù)器,加密,檔案格式,壓縮,發(fā)送電子郵件等等。甚至還有一個(gè)html解析器和相當(dāng)強(qiáng)大的模板引擎去生成 text & html,它會(huì)自動(dòng)過(guò)濾 XSS 攻擊(例如在 Hugo 中的使用)。
各種 APIs 一般都簡(jiǎn)單易懂。它們有時(shí)看起來(lái)過(guò)于簡(jiǎn)單:這個(gè)某種程度上是因?yàn)?goroutine 編程模型意味著我們只需要關(guān)心“看似同步”的操作。這也是因?yàn)橐恍┩ㄓ玫暮瘮?shù)也可以替換許多專門的函數(shù),就像 我最近發(fā)現(xiàn)的關(guān)于時(shí)間計(jì)算的問(wèn)題。
Go 性能優(yōu)越
Go 編譯為本地可執(zhí)行文件。許多 Go 的用戶來(lái)自 Python、Ruby 或 Node.js。對(duì)他們來(lái)說(shuō),這是一種令人興奮的體驗(yàn),因?yàn)樗麄兛吹椒?wù)器可以處理的并發(fā)請(qǐng)求數(shù)量大幅增加。當(dāng)您使用非并發(fā)(Node.js)或全局解釋器鎖定的解釋型語(yǔ)言時(shí),這實(shí)際上是相當(dāng)正常的。結(jié)合語(yǔ)言的簡(jiǎn)易性,這解釋了 Go 令人興奮的原因。
然而與 Java 相比,在 原始性能基準(zhǔn)測(cè)試 中,情況并不是那么清晰。Go 打敗 Java 地方是內(nèi)存使用和垃圾回收。
Go 的垃圾回收器的設(shè)計(jì)目的是 優(yōu)先考慮延遲,并避免停機(jī),這在服務(wù)器中尤其重要。這可能會(huì)帶來(lái)更高的 CPU 成本,但是在水平可伸縮的體系結(jié)構(gòu)中,這很容易通過(guò)添加更多的機(jī)器來(lái)解決。請(qǐng)記住,Go 是由谷歌設(shè)計(jì)的,他們從不會(huì)在資源上面短缺。
與 Java 相比,Go 的垃圾回收器(GC)需要做的更少:切片是一個(gè)連續(xù)的數(shù)組結(jié)構(gòu),而不是像 Java 那樣的指針數(shù)組。類似地,Go maps 也使用小數(shù)組作為 buckets,以實(shí)現(xiàn)相同的目的。這意味著垃圾回收器的工作量減少,并且 CPU 緩存本地化也更好。
Go 同樣在命令行實(shí)用程序中優(yōu)于 Java :作為本地可執(zhí)行文件,Go 程序沒(méi)有啟動(dòng)消耗,反之 Java 首先需要加載和編譯的字節(jié)碼。
語(yǔ)言層面定義源代碼的格式化
我職業(yè)生涯中一些最激烈的辯論發(fā)生在團(tuán)隊(duì)代碼格式的定義上。 Go 通過(guò)為代碼定義規(guī)范格式來(lái)解決這個(gè)問(wèn)題。 gofmt 工具會(huì)重新格式化您的代碼,并且沒(méi)有選項(xiàng)。
不管你喜歡與否,gofmt 定義了如何對(duì)代碼進(jìn)行格式化,一次性解決了這個(gè)問(wèn)題。
標(biāo)準(zhǔn)化的測(cè)試框架
Go 在其標(biāo)準(zhǔn)庫(kù)中提供了一個(gè)很好的 測(cè)試框架。它支持并行測(cè)試、基準(zhǔn)測(cè)試,并包含許多實(shí)用程序,可以輕松測(cè)試網(wǎng)絡(luò)客戶端和服務(wù)器。
Go 程序方便操作
與 Python,Ruby 或 Node.js 相比,必須安裝單個(gè)可執(zhí)行文件對(duì)于運(yùn)維工程師來(lái)說(shuō)是一個(gè)夢(mèng)想。 隨著越來(lái)越多的 Docker 的使用,這個(gè)問(wèn)題越來(lái)越少,但獨(dú)立的可執(zhí)行文件也意味著小型的 Docker 鏡像。
Go還具有一些內(nèi)置的觀察性功能,可以使用 expvar 包發(fā)布內(nèi)部狀態(tài)和指標(biāo),并易于添加新內(nèi)容。但要小心,因?yàn)樗鼈冊(cè)谀J(rèn)的 http 請(qǐng)求處理程序中 自動(dòng)公開,不受保護(hù)。Java 有類似的 JMX ,但它要復(fù)雜得多。
Defer 聲明,防止忘記清理
defer 語(yǔ)句的目的類似于 Java 的 finally:在當(dāng)前函數(shù)的末尾執(zhí)行一些清理代碼,而不管此函數(shù)如何退出。defer 的有趣之處在于它跟代碼塊沒(méi)有聯(lián)系,可以隨時(shí)出現(xiàn)。這使得清理代碼盡可能接近需要清理的代碼:
file, err := os.Open(fileName) if err != nil { return } defer file.Close() // 用文件資源的時(shí)候,我們?cè)僖膊恍枰紤]何時(shí)關(guān)閉它
當(dāng)然,Java的 試用資源 沒(méi)那么冗長(zhǎng),而且 Rust 在其所有者被刪除時(shí)會(huì) 自動(dòng)聲明資源,但是由于 Go 要求您清楚地了解資源清理情況,因此讓它接近資源分配很不錯(cuò)。
新類型
我喜歡類型,因?yàn)橛行┦虑樽屛腋械綈阑鸷秃ε拢e個(gè)例子,我們到處把持久對(duì)象標(biāo)識(shí)符當(dāng)做 string 或 long 類型傳遞使用。 我們通常會(huì)在參數(shù)名稱中對(duì) id 的類型進(jìn)行編碼,但是當(dāng)函數(shù)具有多個(gè)標(biāo)識(shí)符作為參數(shù)并且某些調(diào)用不匹配參數(shù)順序時(shí),會(huì)造成細(xì)微的錯(cuò)誤。
Go 對(duì)新類型有一等支持,即類型為現(xiàn)有類型并賦予其獨(dú)立身份,與原有類型不同。 與包裝相反,新類型沒(méi)有運(yùn)行時(shí)間開銷。 這允許編譯器捕捉這種錯(cuò)誤:
type UserId string // <-- new type type ProductId string func AddProduct(userId UserId, productId ProductId) {} func main() { userId := UserId("some-user-id") productId := ProductId("some-product-id") // 正確的順序: 沒(méi)有問(wèn)題 AddProduct(userId, productId) // 錯(cuò)誤的順序:將會(huì)編譯錯(cuò)誤 AddProduct(productId, userId) // 編譯錯(cuò)誤: // AddProduct 不能用 productId(type ProductId) 作為 type UserId的參數(shù) // Addproduct 不能用 userId(type UserId) 作為type ProfuctId 的參數(shù) }
不幸的是,缺乏泛型使得使用新類型變得麻煩,因?yàn)闉樗鼈兙帉懣芍赜么a需要從原始類型轉(zhuǎn)換值。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“go是不是解釋型語(yǔ)言”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
當(dāng)前文章:go是不是解釋型語(yǔ)言
轉(zhuǎn)載來(lái)于:http://jinyejixie.com/article46/jjpshg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、定制網(wǎng)站、服務(wù)器托管、移動(dòng)網(wǎng)站建設(shè)、品牌網(wǎng)站制作、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)