午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

閑聊Golang對(duì)C語言的改進(jìn)

 F2967527 2019-10-28

看到標(biāo)題,大家可能會(huì)奇怪,為什么將Golang與C語言進(jìn)行比較?這里主要有三方面的原因,一方面,可以說Golang和C都是源于同樣的理念設(shè)計(jì)的編程語言,上一篇文章有說過,UNIX創(chuàng)始人之一Ken Thompson是Golang的設(shè)計(jì)者,同時(shí),他也是C語言設(shè)計(jì)者之一,他深知C語言存在的問題和影響其開發(fā)效率的因素,希望在Golang上得以改善;其次,Golang設(shè)計(jì)之初就希望成為和C/C++一樣的系統(tǒng)語言,執(zhí)行效率應(yīng)當(dāng)與C/C++相媲美,但是要有強(qiáng)大的快速開發(fā)能力;最后,Go語言的語法和C語言一樣,簡單卻強(qiáng)大。

內(nèi)存管理

Golang在C語言的基礎(chǔ)上添加了內(nèi)存管理機(jī)制,這使得C語言開發(fā)中讓人頭大的各種內(nèi)存問題得以解決。Golang初始的幾個(gè)版本內(nèi)存管理機(jī)制被人詬病,垃圾回收會(huì)導(dǎo)致程序停頓,但是現(xiàn)在Golang的內(nèi)存管理已經(jīng)相當(dāng)完善。然而,Golang提供內(nèi)存管理機(jī)制的同時(shí)。依然保留了C語言的指針變量類型,這是為什么?

Golang對(duì)普通變量采用復(fù)制的方式進(jìn)行使用,而指針是將原始對(duì)象的地址進(jìn)行傳遞,例如函數(shù)傳參,普通變量會(huì)進(jìn)行形參向?qū)崊⒌目截?,函?shù)內(nèi)部對(duì)實(shí)參的修改不會(huì)影響到函數(shù)外的變量,而指針變量只是傳遞地址,函數(shù)內(nèi)部對(duì)實(shí)參的修改會(huì)直接改變函數(shù)外的變量。

保留C語言這一概念,為我們的編程帶來了極大地靈活性,C語言編程中有一條簡單的規(guī)則,如果是基本類型(int,float等)建議使用變量,除非需要對(duì)變量進(jìn)行修改;如果使用復(fù)合類型(結(jié)構(gòu)體等),如果不是需要深拷貝的場合,建議使用指針,因?yàn)檫@些類型的變量一般占用內(nèi)存空間比較大,如果使用變量,會(huì)多次復(fù)制,影響程序性能。Golang保留了這一概念,就讓我們可以按照自己的需要選擇合適的方式——使用變量還是指針,代碼設(shè)計(jì)的靈活性更大,改善代碼性能的方式也更簡單。

語句的簡潔性

Golang的語句比C語言更加簡潔,如定義并初始化變量,

C語言中

int a = 0;

Golang中

a := 0

除了不需要分號(hào),a變量之前未定義,使用:=進(jìn)行賦值,就是定義變量a且賦值為0,至于a的數(shù)據(jù)類型,Golang進(jìn)行了自動(dòng)推斷,由于我們使用整形0進(jìn)行賦值,所以a就是整形的變量。

編碼風(fēng)格編譯階段檢查

Golang對(duì)一些編碼風(fēng)格在編譯時(shí)會(huì)進(jìn)行檢查,這樣,代碼的風(fēng)格和質(zhì)量在語法層面上就已經(jīng)進(jìn)行了統(tǒng)一。例如,沒有使用的import,編譯階段會(huì)當(dāng)做編譯錯(cuò)誤;代碼塊左大括號(hào)要求與最接近的上一行代碼同行,也就是說

func Foo() {   //正確

func foo()    //編譯錯(cuò)誤

Golang為了方便大家解決這類錯(cuò)誤,提供了gofmt工具,運(yùn)行g(shù)ofmt直接就會(huì)對(duì)代碼格式進(jìn)行修正。

不使用動(dòng)態(tài)鏈接庫

Golang不支持動(dòng)態(tài)鏈接庫,Golang編譯只會(huì)生成一個(gè)對(duì)應(yīng)的可執(zhí)行文件,引用第三方包,使用go get直接拉取源碼并統(tǒng)一編譯。帶來的好處就是Golang的項(xiàng)目部署極其簡單,可執(zhí)行文件只有一個(gè),配置好配置文件,資源安排好,直接運(yùn)行即可。

具備包體系

Golang引入了包體系,更方便代碼結(jié)構(gòu)的控制和引用第三方資源。C語言沒有包的概念,所以之前文章提到,我們需要自己組織好代碼的位置,防止概念混亂。

面向?qū)ο?/span>

Golang可以進(jìn)行面向?qū)ο缶幊?,Golang在面向?qū)ο蠓矫娌扇×撕虲++,Python等相同的理念,Golang提供了面向?qū)ο蟮臋C(jī)制,但是也可以面向過程編程,Golang不限制你使用的編程思想。

Golang的面向?qū)ο笳Z法非常簡單,派生采用了Has-a的方式,沒有提供Is-a的方式,這有兩方面原因,一方面,在C語言中,如果進(jìn)行派生,我們采用一個(gè)結(jié)構(gòu)體包含另一個(gè)結(jié)構(gòu)體的方式,也就是只能采用Has-a的方式;另外,Is-a的派生方式經(jīng)常存在問題,如果父類的接口發(fā)生變化,經(jīng)常會(huì)直接影響子類的接口也要進(jìn)行調(diào)整,Has-a的方式,父類作為子類的成員變量存在,父類相當(dāng)于封裝在自己的類定義下,代碼的變異不容易擴(kuò)散。

Golang提供了interface,這也是C語言沒有的。另外Golang的interface更加易用,不需要顯式指定一個(gè)類實(shí)現(xiàn)了哪個(gè)interface,只要是一個(gè)類實(shí)現(xiàn)了interface中的所有方法,他就可以被認(rèn)為是這個(gè)interface的實(shí)現(xiàn)。

至于封裝,很簡單,首字母大寫的全局變量,方法和全局函數(shù)是公有的,而首字母小寫的全局變量,方法和全局函數(shù)是包內(nèi)可訪問的。

復(fù)合類型

Golang中的復(fù)合類型主要有數(shù)組,slice,map和結(jié)構(gòu)體。數(shù)組是只讀的list,slice則是可變的list,map提供了鍵值對(duì)的結(jié)構(gòu),結(jié)構(gòu)體是數(shù)據(jù)的打包。可以看到,Golang沒有其他語言的各種容器,泛型等,但是提供的復(fù)合類型卻足夠使用。

type關(guān)鍵字

type和C語言中typedef宏的作用類似,對(duì)一個(gè)類型進(jìn)行重命名,但是Golang中,你會(huì)發(fā)現(xiàn),定義一個(gè)結(jié)構(gòu)體的語法

type FooStruct struct {

    ........

}

還有定義interface的語法

type FooInterface interface {

    ........

}

與其說這是定義,不如說也是進(jìn)行了一種派生(重新命名了沒有成員的struct類型和沒有方法的interface類型),而事實(shí)上,所有類型都可以作為interface{}使用,類似于C語言中的void類型,但是使用時(shí)Golang會(huì)要求進(jìn)行類型斷言(Type Assertion),也就是顯式的類型轉(zhuǎn)換。不得不驚嘆Golang語法簡潔背后的嚴(yán)謹(jǐn)。

goroutine機(jī)制

Golang被極度贊揚(yáng)的是它的異步機(jī)制,也就是goroutine,如何啟動(dòng)一個(gè)異步處理,很簡單,將處理封裝到函數(shù),然后調(diào)用函數(shù)時(shí)在前面加上go,如

go Foo()

除去語法上的簡潔,goroutine是一個(gè)協(xié)程,也就是比線程更節(jié)省資源,一個(gè)線程中可以有多個(gè)協(xié)程,而且goroutine被分配到多個(gè)CPU上運(yùn)行,是真正意義上的并發(fā)。

豐富的標(biāo)準(zhǔn)庫和第三方資源

Golang的標(biāo)準(zhǔn)庫十分強(qiáng)大,甚至于包含了Web開發(fā)的接口,模板等等,這些都是C語言不可比擬的,經(jīng)過幾年的發(fā)展,Golang也擁有了大量的使用人群,所以第三方資源日趨豐富和完善。

以上就是Golang在C基礎(chǔ)上的一些進(jìn)步,總的說來,經(jīng)過一段時(shí)間對(duì)Golang的使用,感受非常好。從Golang可以看到很多C語言的影子,但是很多C開發(fā)時(shí)作為編碼規(guī)范和思想的東西,在Golang中已經(jīng)將其作為語法進(jìn)行了規(guī)范和限制,減少了編碼時(shí)需要考慮的問題量,同時(shí)保留了C語言的靈活性,Golang豐富的標(biāo)準(zhǔn)庫和第三方資源,增加了使用Golang進(jìn)行開發(fā)的手段。

但是,不得不承認(rèn),Golang不適合作為入門級(jí)的編程語言,Golang中語法的很多閃光點(diǎn),需要結(jié)合多種編程語言的對(duì)比才能發(fā)現(xiàn),如果你有豐富的編程經(jīng)驗(yàn),使用Golang時(shí)會(huì)發(fā)現(xiàn),當(dāng)時(shí)關(guān)注的編碼問題,Golang都已經(jīng)考慮到了,這時(shí)你會(huì)感嘆Golang的設(shè)計(jì)。畢竟作為新生代的編程語言主力,不應(yīng)該再出現(xiàn)老一輩語言的問題了,取長補(bǔ)短,正是Golang應(yīng)該做的。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多