今年的早些時候我們對比過了幾種native編程語言,包括D語言、Go、Rust和Vala。這里我們將分析來自Google的Go語言,看看他到底哪里跟別的語言不一樣。 Go語言比其他的很多語言都吸引我,雖然我不是Go語言的專家,但是我很樂意在這里介紹一下它的特性,下面的這些特性指引我轉(zhuǎn)向了Go語言。 快速簡單的編譯: go語言編譯的很快,事實(shí)上,他快的甚至可以作為腳本語言了。幾個使他編譯很快的原因有: 他不使用頭文件當(dāng)A依賴B,B又依賴C時,那么首先會編譯C,然后是B和A;但是如果A依賴B,但是A并不直接依賴于C,而是存在依賴傳遞,這時會把所有B需要從C拿到的信息放在B的對象代碼里。這樣,當(dāng)編譯A的時候,就不需要再管C了。在編譯程序時,只需將類型信息沿著依賴關(guān)系樹向上遍歷即可,如果到達(dá)樹的頂端,則只需編譯緊鄰的依賴,而不用管其它層級的依賴了。通過多返回值的錯誤處理: 現(xiàn)代的編程語言基本上有兩種錯誤處理辦法,例如在C語言里是使用返回值,而在Java等面向?qū)ο笳Z言里使用異常處理返回值,因?yàn)榉祷刂档臓顟B(tài)碼總是可能跟需要返回的結(jié)果有沖突。Go語言允許多返回值,從某種程度上解決了這個問題。你可以為你的函數(shù)的執(zhí)行結(jié)果狀態(tài)定義返回值,任何調(diào)用的時候都可以來檢查,很方便。簡單的組合: 可以使用interface為對象指定一些類型的成員,還可以像Java一樣給他們指定操作(行為)。例如在標(biāo)準(zhǔn)庫的io包中定義了一個Writer,就有一個帶有字節(jié)數(shù)組作為參數(shù)(輸入)一個integer值和錯誤碼作為返回值(輸出)的方法。而實(shí)現(xiàn)了io.Writer接口中的Write方法的類型才是實(shí)際被執(zhí)行的。這個設(shè)計(jì)能夠非常優(yōu)雅的分離代碼,還簡化了單元測試過程,例如,如果你想測試一個數(shù)據(jù)庫對象的一個方法,在傳統(tǒng)的語言中你必須創(chuàng)建一個數(shù)據(jù)庫對象,然后做很多協(xié)議初始化工作。在Go語言中,你可在接口下創(chuàng)建任何對象。簡單的并發(fā): 在Go中并發(fā)變得非常的簡單,在任何函數(shù)前方上go兩個字母,這個函數(shù)就將以他自己的go-routine(一個非常輕量級的線程)來運(yùn)行,Go- routines之間通過channels來通信。我們通常會有一些需要線程同步和互斥的需求,在Go中非常簡單,Go只是啟動并發(fā)任務(wù),各個任務(wù)之間通過channels來通信,從而協(xié)調(diào)同步和互斥。優(yōu)秀的錯誤提示: 我從沒見過別的語言有Go語言這么高的錯誤診斷質(zhì)量。例如如果你的程序思索了,Go的運(yùn)行時可以通知你,而且,他甚至可以告訴你是哪個線程出了問題。當(dāng)然編譯錯誤也是很詳細(xì)很有用的。其他特性:Go語言還有其他非常吸引人的特性:高階函數(shù)、垃圾回收、哈希映射、可擴(kuò)展的數(shù)組等等。當(dāng)然了,沒有一件東西是非常完美的,Go語言的開發(fā)工具還非常缺乏,社區(qū)很小,但是這個語言的背后支持者是Google,這些問題都會一步一步的解決。當(dāng)其他語言,尤其是D語言、Rust、Vala旨在簡化C++而且增加新的特性的時候,他們都覺得自己像是帶著新特性的C++。
創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比政和網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式政和網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋政和地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。
沒有定義。
Go語言特點(diǎn)1、函數(shù)式編程閉包。
2、工程化資源管理,錯誤處理,測試無參,也沒有定義返回值聲明以后是import語句,引入要的模塊。
1 select語句的每個case語句必須IO操作
2 執(zhí)行 case 語句順序是隨機(jī)的
3 select的每個case(包含default)語句是阻塞的
4 如果case語句均發(fā)生阻塞,那么執(zhí)行default語句
本文主要介紹了Go語言中文件讀寫的相關(guān)操作。
文件是什么?
計(jì)算機(jī)中的文件是存儲在外部介質(zhì)(通常是磁盤)上的數(shù)據(jù)集合,文件分為文本文件和二進(jìn)制文件。
os.Open() 函數(shù)能夠打開一個文件,返回一個 *File 和一個 err 。對得到的文件實(shí)例調(diào)用 close() 方法能夠關(guān)閉文件。
為了防止文件忘記關(guān)閉,我們通常使用defer注冊文件關(guān)閉語句。
Read方法定義如下:
它接收一個字節(jié)切片,返回讀取的字節(jié)數(shù)和可能的具體錯誤,讀到文件末尾時會返回 0 和 io.EOF 。 舉個例子:
使用for循環(huán)讀取文件中的所有數(shù)據(jù)。
bufio是在file的基礎(chǔ)上封裝了一層API,支持更多的功能。
io/ioutil 包的 ReadFile 方法能夠讀取完整的文件,只需要將文件名作為參數(shù)傳入。
os.OpenFile() 函數(shù)能夠以指定模式打開文件,從而實(shí)現(xiàn)文件寫入相關(guān)功能。
其中:
name :要打開的文件名 flag :打開文件的模式。 模式有以下幾種:
perm :文件權(quán)限,一個八進(jìn)制數(shù)。r(讀)04,w(寫)02,x(執(zhí)行)01。
?? 當(dāng)讀取91.2 MB文件時,read1耗時43ms,read2耗時99ms。
查看源碼:
讀取文件主要是通過 Read(p []byte) (n int, err error) :
官方文檔中關(guān)于該接口方法的說明:
結(jié)論:
??ReadFile(filename string)方法之所以速度快的原因就是先計(jì)算出file文件的size,在初始化對應(yīng)size大小的buff,傳入ReadRead(p []byte) 來讀取字節(jié)流