程序員宅家的第12天,我決定開始學Go語言了

宅在家中十幾天,不少小夥伴都想在趁機學學知識,異步君強烈推薦,在2月TIOBE編程語言指數排行榜上位列第11位的Go語言,一年內上升7位的趨勢,得到了大家的密切關注,可謂是編程語言中的新黑馬。


程序員宅家的第12天,我決定開始學Go語言了


事實上,在高端開發工作中,“小而美”的go語言,往往能成為點睛之筆。著名的百度系開源平臺BFE,團隊在經過與C、Python與Go的對比之後,決定基於Go語言重構開發,與前兩者相比,Go語言性能和C接近、研發效率更高、系統的安全和穩定性更高!


程序員宅家的第12天,我決定開始學Go語言了


從長期趨勢看,基於更高級編程語言的軟件系統會逐步取得競爭的優勢。接下來,異步君就從go語言的應用前景和語法優勢等方面為大家詳解!


人氣居高不下,Go語言有何魔力?


三十年河東三十年河西,在編程語言的陣營裡,這種現象更是常見。最近幾年,原本冷門小眾的Go語言人氣日漸高漲。


程序員宅家的第12天,我決定開始學Go語言了


從2009年發佈至今,Go語言已經走過了十多年的時間。由於其安全性高、語法簡單、編譯快速等諸多特點,越來越多的大公司開始使用Go語言重新築建其後端的基礎架構和服務。


Go是一門為雲計算而生的編程語言。不僅是國外的Google、AWS,國內的阿里、今日頭條等公司也已經開始大規模使用Go來開發重要的項目,由於CloudFlare、Cockroach Labs、DigitalOcean、Docker、InfluxData、 Iron.io、Let’s Encrypt、Light Code Labs、Red Hat CoreOS、SendGrid 這樣的公司以及雲原生計算基金會(Cloud Native Computing Foundation)等組織的推動,許多 Web 底層基礎設施正在陸續遷移至Go之上。


Go語言特點就是簡單易學,從而形成了一種有偏向性的編程風格——go style。其風格貫穿了Go語言的所有項目,減少了在配置lint規則和學習不同編程風格所花費的時間。


Go語言

1.什麼是Go

Go是一門編譯語言。在運行程序之前,Go首先需要使用編譯器將用戶編寫的代碼轉換為計算機能夠理解的0和1。為了便於執行和分發,Go編譯器還會把所有代碼整合並編譯成一個單獨的可執行文件。在編譯的過程中,Go編譯器能夠捕捉到程序中包括拼寫錯誤在內的一些人為失誤。


並非所有編程語言都需要編譯才能運行,如Python、Ruby和其他一些流行語言就選擇了在程序運行的時候,通過解釋器一條接一條的轉化代碼中的聲明,但這也意味著bug可能會隱藏在測試尚未觸及的代碼當中。


不過換個角度來看,解釋器不僅能夠讓開發過程變得迅速且具有交互性,還能夠讓語言本身變得靈活、輕鬆和令人愉快。相反,編譯語言卻常常因為像機器人一樣頑固不化、墨守成規而廣為人知,並且緩慢的編譯速度也常常為人所詬病,然而實際上並非所有編譯語言都是如此。


我們想要構造出這樣一種語言,它不僅可以像C++和Java這類靜態編譯語言一樣安全、高效,還可以像Python這類動態類型解釋語言一樣輕巧且充滿樂趣。


——James Gosling,Java: an Overview


Java避免了C++當中許多不常見、難懂和令人迷惑的特性,根據我們的經驗,這些特性帶來的麻煩要比好處多得多。


Go在考慮軟件開發的體驗方面可謂煞費苦心。首先,即使是大型程序的編譯也可以在極短的時間內完成,並且只需要用到一條命令。其次,Go語言排除了那些可能會導致歧義的特性,鼓勵可預測和簡明易懂的代碼。最後,Go為Java等傳統語言死板的數據結構提供了輕量級的替代品。

——James Gosling,Java: an Overview


Go不僅像解釋語言一樣簡單和有趣,還在性能和可靠性上佔有優勢,並且由於Go是一門只包含幾種簡單概念的小型語言,所以學習起來也相對較快。綜上所述,我們得出以下Go箴言:


Go是一門開源編程語言,使用它可以大規模地生產出簡單、高效且可信賴的軟件。


每一種新的編程語言都會對以往想法進行改良。與早期語言相比,在Go裡面高效地使用內存將變得更為容易,出錯的可能性也更低,並且Go還能利用多核機器上的每個核心獲得額外的性能優勢。很多成功案例都會把性能提升列舉為轉向Go的其中一個原因。例如,Iron.io只用了2臺Go服務器就替換了他們原來使用的30臺Ruby服務器;而Bitly在使用Go重寫原有的Python應用程序之後也獲得了持續、可測量的性能提升,這導致他們在之後把自己的C應用程序也“更新換代”成了相應的Go版本。

——Go品牌手冊


2.Go Playground


學習Go語言最快捷的方式就是使用Go Playground,這個工具可以讓你在無須安裝任何軟件的情況下直接編輯、運行和試驗Go程序。當你點擊Go Playground 中的 Run(運行)按鈕的時候,Go Playground就會在谷歌公司的服務器上編譯並執行你輸入的代碼,然後在屏幕上顯示執行代碼的結果。


程序員宅家的第12天,我決定開始學Go語言了


點擊Go Playground中的Share(分享)按鈕可以獲得一個訪問當前代碼的鏈接。你可以通過這個鏈接把自己的代碼分享給朋友,或者將其用作瀏覽器書籤以便保存工作進度。


3.包和函數

當我們訪問 Go Playground 的時候將會看到代碼清單 1-1 所示的代碼,它作為學習Go語言的起點真的再合適不過了。


<code>代碼清單1-1與 Go Playground 的初次見面:playground.gopackagemain←---聲明本代碼所屬的包import("fmt"←---導入fmt(是format的縮寫)包,使其可用)funcmain(){←---聲明一個名為main的函數fmt.Println("Hello,playground")←---在屏幕上打印出“Hello,playground”}/<code>


儘管這段代碼非常簡短,但它引入了package、import 和func這 3 個非常重要的關鍵字,這些保留的關鍵字都有它們各自的特殊目的。


package關鍵字聲明瞭代碼所屬的包,在本例中這個包的名字就是main。所有用Go編寫的代碼都會被組織成各式各樣的包,並且每個包都對應一個單獨的構想,例如,Go語言本身就提供了一個面向數學、壓縮、加密、圖像處理等領域的標準庫。


在 package 關鍵字之後,代碼使用了import 關鍵字來導入自己將要用到的包。一個包可以包含任意數量的函數。例如,math 包提供了諸如Sin、Cos、Tan和 Sqrt等函數,而此處用到的fmt包則提供了用於格式化輸入和輸出的函數。因為在屏幕上顯示文本是一個非常常用的操作,所以 Go 使用了縮寫 fmt 作為包名。gopher 通常把這個包的名字讀作“FŌŌMT!”,給人的感覺彷彿這個庫是使用漫畫書上的大爆炸字體撰寫的一樣。


func關鍵字用於聲明函數,在本例中這個函數的名字就是main。每個函數的體(body)都需要使用大括號{}包圍,這樣Go才能知道每個函數從何處開始,又在何處結束。


main這一標識符(identifier)具有特殊意義。當我們運行一個Go程序的時候,它總是從main包的main函數開始運行。如果main不存在,那麼Go編譯器將報告一個錯誤,因為它無法得知程序應該從何處開始執行。


為了打印出一個由文本組成的行,例子中的代碼使用了Println函數(其中 ln 為英文 line 的縮寫)。每次用到被導入包中的某個函數時,我們都需要在函數的名字前面加上包的名字以及一個點號作為前綴。例如,代碼清單 1-1 中的Println函數前面就帶有fmt後跟一個點號作為前綴,這是因為Println函數就是由被導入的 fmt 包提供的。Go的這一特性可以讓用戶在閱讀代碼的時候立即弄清楚各個函數分別來自哪個包。


程序員宅家的第12天,我決定開始學Go語言了


當我們按下 Go Playground 中的Run按鈕時,代碼中被引號包圍的文本將輸出至屏幕,最終使得文本“Hello, playground”出現在 Go Playground 中的輸出區域中。對英語來說,即使缺少一個逗號也有可能使整個句子的意義變得完全不同。同樣,標點符號對編程語言來說也是至關重要的。例如,Go就需要依靠引號、圓括號和大括號等符號來理解用戶輸入的代碼。


4.唯一允許的大括號放置風格

Go對於大括號{}的擺放位置非常挑剔。在代碼清單 1-1 中,左大括號{與 func 關鍵字位於同一行,而右大括號}則獨佔一行。這是 Go語言唯一允許的大括號放置風格,除此之外的其他大括號放置風格都是不被允許的。


Go之所以如此嚴格地限制大括號的放置風格,與這門語言剛剛誕生時出現的一些情況有關。在早期,使用Go編寫的代碼總是無一倖免地帶有分號,它們就像迷路的小狗一樣跟在每條單獨的語句後面,例如:


<code>fmt.Println("Hello,firehydrant");/<code>


到了 2009 年 12 月,一群“忍者”gopher 決定把分號從語言中驅逐出去。好吧,這麼說也不太準確。實際上,Go編譯器將為你代勞,自動地插入那些可愛的分號。這種機制運行得非常完美,但它的代價就是要求用戶必須遵守上面提到的唯一允許的大括號放置風格。


程序員宅家的第12天,我決定開始學Go語言了


如果用戶嘗試將左大括號和 func關鍵字放在不同的行裡面,那麼 Go編譯器將報告一個語法錯誤:


<code>funcmain(←---函數體缺失{←---語法錯誤:在{之前發現了意料之外的分號或新行}/<code> 


出現這個問題並不是編譯器有意刁難,而是由於分號被插到了錯誤的位置,導致編譯器犯了點兒小迷糊,最終才不得不求助於你。


書籍簡介

無論你是打算使用 Go編寫大型的併發Web服務,還是隻想用Go編寫小型腳本和簡單的工具,本書都會幫助你打下堅實的基礎。


GO語言趣學指南


程序員宅家的第12天,我決定開始學Go語言了

作者: [加] 內森•揚曼 [英] 羅傑•佩珀


這本書是搶讀版圖書,本書作者Nathan Youngman是一位自學成才的網絡開發人員和終身學習者,他擔任Edmonton Go大會的組織者,是加拿大代碼學習的導師。


這本面向Go語言初學者的書,書中循序漸進地介紹了使用Go語言必需知道的知識,展示了非常多生動有趣的例子,並通過提供大量練習來加深讀者對書中所述內容的理解。


本書共分8個單元,核心內容包括7個單元,分別介紹變量、常量、分支和循環等基礎語句,整數、浮點數和字符串等常用類型,類型、函數和方法,數組、切片和映射,結構和接口,指針、nil和錯誤處理方法,併發和狀態保護,並且每個單元都包含相應的大章和單元測試。


領取本書的資料,回覆關鍵詞go.獲取。

-END-


分享到:


相關文章: