Go語(yǔ)言的核心特性有哪些-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)Go語(yǔ)言的核心特性有哪些,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

10年積累的成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)制作后付款的網(wǎng)站建設(shè)流程,更有興寧免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

一、思想

Less can be more

大道至簡(jiǎn),小而蘊(yùn)真

讓事情變得復(fù)雜很容易,讓事情變得簡(jiǎn)單才難

深刻的工程文化

二、核心特性

Go語(yǔ)言之所以厲害,是因?yàn)樗诜?wù)端的開發(fā)中,總能抓住程序員的痛點(diǎn),以最直接、簡(jiǎn)單、高效、穩(wěn)定的方式來(lái)解決問(wèn)題。這里我們并不會(huì)深入討論GO語(yǔ)言的具體語(yǔ)法,只會(huì)將語(yǔ)言中關(guān)鍵的、對(duì)簡(jiǎn)化編程具有重要意義的方面介紹給大家,體驗(yàn)Go的核心特性。

2.1 并發(fā)編程

Go語(yǔ)言在并發(fā)編程方面比絕大多數(shù)語(yǔ)言要簡(jiǎn)潔不少,這一點(diǎn)是其大亮點(diǎn)之一,也是其在未來(lái)進(jìn)入高并發(fā)高性能場(chǎng)景的重要籌碼。

Go語(yǔ)言的核心特性有哪些

不同于傳統(tǒng)的多進(jìn)程或多線程,golang的并發(fā)執(zhí)行單元是一種稱為goroutine的協(xié)程。

由于在共享數(shù)據(jù)場(chǎng)景中會(huì)用到鎖,再加上GC,其并發(fā)性能有時(shí)不如異步復(fù)用IO模型,因此相對(duì)于大多數(shù)語(yǔ)言來(lái)說(shuō),golang的并發(fā)編程簡(jiǎn)單比并發(fā)性能更具賣點(diǎn)。

在當(dāng)今這個(gè)多核時(shí)代,并發(fā)編程的意義不言而喻。當(dāng)然,很多語(yǔ)言都支持多線程、多進(jìn)程編程,但遺憾的是,實(shí)現(xiàn)和控制起來(lái)并不是那么令人感覺(jué)輕松和愉悅。Golang不同的是,語(yǔ)言級(jí)別支持協(xié)程(goroutine)并發(fā)(協(xié)程又稱微線程,比線程更輕量、開銷更小,性能更高),操作起來(lái)非常簡(jiǎn)單,語(yǔ)言級(jí)別提供關(guān)鍵字(go)用于啟動(dòng)協(xié)程,并且在同一臺(tái)機(jī)器上可以啟動(dòng)成千上萬(wàn)個(gè)協(xié)程。協(xié)程經(jīng)常被理解為輕量級(jí)線程,一個(gè)線程可以包含多個(gè)協(xié)程,共享堆不共享?xiàng)?。協(xié)程間一般由應(yīng)用程序顯式實(shí)現(xiàn)調(diào)度,上下文切換無(wú)需下到內(nèi)核層,高效不少。協(xié)程間一般不做同步通訊,而golang中實(shí)現(xiàn)協(xié)程間通訊有兩種:1)共享內(nèi)存型,即使用全局變量+mutex鎖來(lái)實(shí)現(xiàn)數(shù)據(jù)共享;2)消息傳遞型,即使用一種獨(dú)有的channel機(jī)制進(jìn)行異步通訊。

對(duì)比JAVA的多線程和GO的協(xié)程實(shí)現(xiàn),明顯更直接、簡(jiǎn)單。這就是GO的魅力所在,以簡(jiǎn)單、高效的方式解決問(wèn)題,關(guān)鍵字go,或許就是GO語(yǔ)言最重要的標(biāo)志。

高并發(fā)是Golang語(yǔ)言大的亮點(diǎn)

2.2 內(nèi)存回收(GC)

從C到C++,從程序性能的角度來(lái)考慮,這兩種語(yǔ)言允許程序員自己管理內(nèi)存,包括內(nèi)存的申請(qǐng)和釋放等。因?yàn)闆](méi)有垃圾回收機(jī)制所以C/C++運(yùn)行起來(lái)速度很快,但是隨著而來(lái)的是程序員對(duì)內(nèi)存使用上的很謹(jǐn)小慎微的考慮。因?yàn)槟呐乱稽c(diǎn)不小心就可能會(huì)導(dǎo)致“內(nèi)存泄露”使得資源浪費(fèi)或者“野指針”使得程序崩潰等,盡管C++11后來(lái)使用了智能指針的概念,但是程序員仍然需要很小心的使用。后來(lái)為了提高程序開發(fā)的速度以及程序的健壯性,java和C#等高級(jí)語(yǔ)言引入了GC機(jī)制,即程序員不需要再考慮內(nèi)存的回收等,而是由語(yǔ)言特性提供垃圾回收器來(lái)回收內(nèi)存。但是隨之而來(lái)的可能是程序運(yùn)行效率的降低。

GC過(guò)程是:先stop the world,掃描所有對(duì)象判活,把可回收對(duì)象在一段bitmap區(qū)中標(biāo)記下來(lái),接著立即start the world,恢復(fù)服務(wù),同時(shí)起一個(gè)專門gorountine回收內(nèi)存到空閑list中以備復(fù)用,不物理釋放。物理釋放由專門線程定期來(lái)執(zhí)行。

GC瓶頸在于每次都要掃描所有對(duì)象來(lái)判活,待收集的對(duì)象數(shù)目越多,速度越慢。一個(gè)經(jīng)驗(yàn)值是掃描10w個(gè)對(duì)象需要花費(fèi)1ms,所以盡量使用對(duì)象少的方案,比如我們同時(shí)考慮鏈表、map、slice、數(shù)組來(lái)進(jìn)行存儲(chǔ),鏈表和map每個(gè)元素都是一個(gè)對(duì)象,而slice或數(shù)組是一個(gè)對(duì)象,因此slice或數(shù)組有利于GC。

GC性能可能隨著版本不斷更新會(huì)不斷優(yōu)化,這塊沒(méi)仔細(xì)調(diào)研,團(tuán)隊(duì)中有HotSpot開發(fā)者,應(yīng)該會(huì)借鑒jvm gc的設(shè)計(jì)思想,比如分代回收、safepoint等。

  • 內(nèi)存自動(dòng)回收,再也不需要開發(fā)人員管理內(nèi)存

  • 開發(fā)人員專注業(yè)務(wù)實(shí)現(xiàn),降低了心智負(fù)擔(dān)

  • 只需要new分配內(nèi)存,不需要釋放

2.3 內(nèi)存分配

初始化階段直接分配一塊大內(nèi)存區(qū)域,大內(nèi)存被切分成各個(gè)大小等級(jí)的塊,放入不同的空閑list中,對(duì)象分配空間時(shí)從空閑list中取出大小合適的內(nèi)存塊。內(nèi)存回收時(shí),會(huì)把不用的內(nèi)存重放回空閑list。空閑內(nèi)存會(huì)按照一定策略合并,以減少碎片。

2.4 編譯

編譯涉及到兩個(gè)問(wèn)題:編譯速度和依賴管理

目前Golang具有兩種編譯器,一種是建立在GCC基礎(chǔ)上的Gccgo,另外一種是分別針對(duì)64位x64和32位x86計(jì)算機(jī)的一套編譯器(6g和8g)。

依賴管理方面,由于golang絕大多數(shù)第三方開源庫(kù)都在github上,在代碼的import中加上對(duì)應(yīng)的github路徑就可以使用了,庫(kù)會(huì)默認(rèn)下載到工程的pkg目錄下。

另外,編譯時(shí)會(huì)默認(rèn)檢查代碼中所有實(shí)體的使用情況,凡是沒(méi)使用到的package或變量,都會(huì)編譯不通過(guò)。這是golang挺嚴(yán)謹(jǐn)?shù)囊幻妗?/p>

2.5 網(wǎng)絡(luò)編程

由于golang誕生在互聯(lián)網(wǎng)時(shí)代,因此它天生具備了去中心化、分布式等特性,具體表現(xiàn)之一就是提供了豐富便捷的網(wǎng)絡(luò)編程接口,比如socket用net.Dial(基于tcp/udp,封裝了傳統(tǒng)的connect、listen、accept等接口)、http用http.Get/Post()、rpc用client.Call('class_name.method_name', args, &reply),等等。

高性能HTTP Server

2.6 函數(shù)多返回值

在C,C++中,包括其他的一些高級(jí)語(yǔ)言是不支持多個(gè)函數(shù)返回值的。但是這項(xiàng)功能又確實(shí)是需要的,所以在C語(yǔ)言中一般通過(guò)將返回值定義成一個(gè)結(jié)構(gòu)體,或者通過(guò)函數(shù)的參數(shù)引用的形式進(jìn)行返回。而在Go語(yǔ)言中,作為一種新型的語(yǔ)言,目標(biāo)定位為強(qiáng)大的語(yǔ)言當(dāng)然不能放棄對(duì)這一需求的滿足,所以支持函數(shù)多返回值是必須的。

函數(shù)定義時(shí)可以在入?yún)⒑竺嬖偌?a,b,c),表示將有3個(gè)返回值a、b、c。這個(gè)特性在很多語(yǔ)言都有,比如python。

這個(gè)語(yǔ)法糖特性是有現(xiàn)實(shí)意義的,比如我們經(jīng)常會(huì)要求接口返回一個(gè)三元組(errno,errmsg,data),在大多數(shù)只允許一個(gè)返回值的語(yǔ)言中,我們只能將三元組放入一個(gè)map或數(shù)組中返回,接收方還要寫代碼來(lái)檢查返回值中包含了三元組,如果允許多返回值,則直接在函數(shù)定義層面上就做了強(qiáng)制,使代碼更簡(jiǎn)潔安全。

2.7 語(yǔ)言交互性

語(yǔ)言交互性指的是本語(yǔ)言是否能和其他語(yǔ)言交互,比如可以調(diào)用其他語(yǔ)言編譯的庫(kù)。

在Go語(yǔ)言中直接重用了大部份的C模塊,這里稱為Cgo.Cgo允許開發(fā)者混合編寫C語(yǔ)言代碼,然后Cgo工具可以將這些混合的C代碼提取并生成對(duì)于C功能的調(diào)用包裝代碼。開發(fā)者基本上可以完全忽略這個(gè)Go語(yǔ)言和C語(yǔ)言的邊界是如何跨越的。

golang可以和C程序交互,但不能和C++交互??梢杂袃煞N替代方案:1)先將c++編譯成動(dòng)態(tài)庫(kù),再由go調(diào)用一段c代碼,c代碼通過(guò)dlfcn庫(kù)動(dòng)態(tài)調(diào)用動(dòng)態(tài)庫(kù)(記得export LD_LIBRARY_PATH);2)使用swig(沒(méi)玩過(guò))

2.8 異常處理

golang不支持try...catch這樣的結(jié)構(gòu)化的異常解決方式,因?yàn)橛X(jué)得會(huì)增加代碼量,且會(huì)被濫用,不管多小的異常都拋出。golang提倡的異常處理方式是:

  • 普通異常:被調(diào)用方返回error對(duì)象,調(diào)用方判斷error對(duì)象。

  • 嚴(yán)重異常:指的是中斷性panic(比如除0),使用defer...recover...panic機(jī)制來(lái)捕獲處理。嚴(yán)重異常一般由golang內(nèi)部自動(dòng)拋出,不需要用戶主動(dòng)拋出,避免傳統(tǒng)try...catch寫得到處都是的情況。當(dāng)然,用戶也可以使用panic('xxxx')主動(dòng)拋出,只是這樣就使這一套機(jī)制退化成結(jié)構(gòu)化異常機(jī)制了。

2.9 其他一些有趣的特性

  • 類型推導(dǎo):類型定義:支持var abc = 10這樣的語(yǔ)法,讓golang看上去有點(diǎn)像動(dòng)態(tài)類型語(yǔ)言,但golang實(shí)際上時(shí)強(qiáng)類型的,前面的定義會(huì)被自動(dòng)推導(dǎo)出是int類型。

    作為強(qiáng)類型語(yǔ)言,隱式的類型轉(zhuǎn)換是不被允許的,記住一條原則:讓所有的東西都是顯式的。

    簡(jiǎn)單來(lái)說(shuō),Go是一門寫起來(lái)像動(dòng)態(tài)語(yǔ)言,有著動(dòng)態(tài)語(yǔ)言開發(fā)效率的靜態(tài)語(yǔ)言。

  • 一個(gè)類型只要實(shí)現(xiàn)了某個(gè)interface的所有方法,即可實(shí)現(xiàn)該interface,無(wú)需顯式去繼承。

    Go編程規(guī)范推薦每個(gè)Interface只提供一到兩個(gè)的方法。這樣使得每個(gè)接口的目的非常清晰。另外Go的隱式推導(dǎo)也使得我們組織程序架構(gòu)的時(shí)候更加靈活。在寫JAVA/C++程序的時(shí)候,我們一開始就需要把父類/子類/接口設(shè)計(jì)好,因?yàn)橐坏┖竺嬗凶兏?,修改起?lái)會(huì)非常痛苦。而Go不一樣,當(dāng)你在實(shí)現(xiàn)的過(guò)程中發(fā)現(xiàn)某些方法可以抽象成接口的時(shí)候,你直接定義好這個(gè)接口就OK了,其他代碼不需要做任何修改,編譯器的自動(dòng)推導(dǎo)會(huì)幫你做好一切。

  • 不能循環(huán)引用:即如果a.go中import了b,則b.go要是import a會(huì)報(bào)import cycle not allowed。好處是可以避免一些潛在的編程危險(xiǎn),比如a中的func1()調(diào)用了b中的func2(),如果func2()也能調(diào)用func1(),將會(huì)導(dǎo)致無(wú)限循環(huán)調(diào)用下去。

  • defer機(jī)制:在Go語(yǔ)言中,提供關(guān)鍵字defer,可以通過(guò)該關(guān)鍵字指定需要延遲執(zhí)行的邏輯體,即在函數(shù)體return前或出現(xiàn)panic時(shí)執(zhí)行。這種機(jī)制非常適合善后邏輯處理,比如可以盡早避免可能出現(xiàn)的資源泄漏問(wèn)題。

    可以說(shuō),defer是繼goroutine和channel之后的另一個(gè)非常重要、實(shí)用的語(yǔ)言特性,對(duì)defer的引入,在很大程度上可以簡(jiǎn)化編程,并且在語(yǔ)言描述上顯得更為自然,極大的增強(qiáng)了代碼的可讀性。

  • “包”的概念:和python一樣,把相同功能的代碼放到一個(gè)目錄,稱之為包。包可以被其他包引用。main包是用來(lái)生成可執(zhí)行文件,每個(gè)程序只有一個(gè)main包。包的主要用途是提高代碼的可復(fù)用性。通過(guò)package可以引入其他包。

  • 編程規(guī)范:GO語(yǔ)言的編程規(guī)范強(qiáng)制集成在語(yǔ)言中,比如明確規(guī)定花括號(hào)擺放位置,強(qiáng)制要求一行一句,不允許導(dǎo)入沒(méi)有使用的包,不允許定義沒(méi)有使用的變量,提供gofmt工具強(qiáng)制格式化代碼等等。奇怪的是,這些也引起了很多程序員的不滿,有人發(fā)表GO語(yǔ)言的XX條罪狀,里面就不乏對(duì)編程規(guī)范的指責(zé)。要知道,從工程管理的角度,任何一個(gè)開發(fā)團(tuán)隊(duì)都會(huì)對(duì)特定語(yǔ)言制定特定的編程規(guī)范,特別像Google這樣的公司,更是如此。GO的設(shè)計(jì)者們認(rèn)為,與其將規(guī)范寫在文檔里,還不如強(qiáng)制集成在語(yǔ)言里,這樣更直接,更有利用團(tuán)隊(duì)協(xié)作和工程管理。

  • 交叉編譯:比如說(shuō)你可以在運(yùn)行 Linux 系統(tǒng)的計(jì)算機(jī)上開發(fā)運(yùn)行 Windows 下運(yùn)行的應(yīng)用程序。這是第一門完全支持 UTF-8 的編程語(yǔ)言,這不僅體現(xiàn)在它可以處理使用 UTF-8 編碼的字符串,就連它的源碼文件格式都是使用的 UTF-8 編碼。Go 語(yǔ)言做到了真正的國(guó)際化!

三、功能

此處我們說(shuō)個(gè)小段子:

很久以前,有一個(gè)IT公司,這公司有個(gè)傳統(tǒng),允許員工擁有20%自由時(shí)間來(lái)開發(fā)實(shí)驗(yàn)性項(xiàng)目。在2007的某一天,公司的幾個(gè)大牛,正在用c++開發(fā)一些比較繁瑣但是核心的工作,主要包括龐大的分布式集群,大牛覺(jué)得很鬧心,后來(lái)c++委員會(huì)來(lái)他們公司演講,說(shuō)c++將要添加大概35種新特性。這幾個(gè)大牛的其中一個(gè)人,名為:Rob Pike,聽(tīng)后心中一萬(wàn)個(gè)xxx飄過(guò),“c++特性還不夠多嗎?簡(jiǎn)化c++應(yīng)該更有成就感吧”。于是乎,Rob Pike和其他幾個(gè)大牛討論了一下,怎么解決這個(gè)問(wèn)題,過(guò)了一會(huì),Rob Pike說(shuō)要不我們自己搞個(gè)語(yǔ)言吧,名字叫“go”,非常簡(jiǎn)短,容易拼寫。其他幾位大牛就說(shuō)好啊,然后他們找了塊白板,在上面寫下希望能有哪些功能。接下來(lái)的時(shí)間里,大牛們開心的討論設(shè)計(jì)這門語(yǔ)言的特性,經(jīng)過(guò)漫長(zhǎng)的歲月,他們決定,以c語(yǔ)言為原型,以及借鑒其他語(yǔ)言的一些特性,來(lái)解放程序員,解放自己,然后在2009年,go語(yǔ)言誕生。

以下就是這些大牛所羅列出的Go要有的功能:

  • 規(guī)范的語(yǔ)法(不需要符號(hào)表來(lái)解析)

  • 垃圾回收(獨(dú)有)

  • 無(wú)頭文件

  • 明確的依賴

  • 無(wú)循環(huán)依賴

  • 常量只能是數(shù)字

  • int和int32是兩種類型

  • 字母大小寫設(shè)置可見(jiàn)性(letter case sets visibility)

  • 任何類型(type)都有方法(不是類型)

  • 沒(méi)有子類型繼承(不是子類)

  • 包級(jí)別初始化以及明確的初始化順序

  • 文件被編譯到一個(gè)包里

  • 包package-level globals presented in any order

  • 沒(méi)有數(shù)值類型轉(zhuǎn)換(常量起輔助作用)

  • 接口隱式實(shí)現(xiàn)(沒(méi)有“implement”聲明)

  • 嵌入(不會(huì)提升到超類)

  • 方法按照函數(shù)聲明(沒(méi)有特別的位置要求)

  • 方法即函數(shù)

  • 接口只有方法(沒(méi)有數(shù)據(jù))

  • 方法通過(guò)名字匹配(而非類型)

  • 沒(méi)有構(gòu)造函數(shù)和析構(gòu)函數(shù)

  • postincrement(如++i)是狀態(tài),不是表達(dá)式

  • 沒(méi)有preincrement(i++)和predecrement

  • 賦值不是表達(dá)式

  • 明確賦值和函數(shù)調(diào)用中的計(jì)算順序(沒(méi)有“sequence point”)

  • 沒(méi)有指針運(yùn)算

  • 內(nèi)存一直以零值初始化

  • 局部變量取值合法

  • 方法中沒(méi)有“this”

  • 分段的堆棧

  • 沒(méi)有靜態(tài)和其它類型的注釋

  • 沒(méi)有模板

  • 內(nèi)建string、slice和map

  • 數(shù)組邊界檢查

關(guān)于“Go語(yǔ)言的核心特性有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

名稱欄目:Go語(yǔ)言的核心特性有哪些-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://bm7419.com/article36/dgdisg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、域名注冊(cè)企業(yè)建站、企業(yè)網(wǎng)站制作品牌網(wǎng)站建設(shè)、網(wǎng)站策劃

廣告

聲明:本網(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)

成都seo排名網(wǎng)站優(yōu)化