GO編程語言是什麼?如何訪問Go Playground?


本章學習目標

  • 瞭解Go與眾不同的地方
  • 瞭解如何訪問Go Playground
  • 學會將文本打印到屏幕上
  • 對包含任意自然語言的文本進行實驗

Go是一門為雲計算而生的編程語言。包括亞馬遜(Amazon)、蘋果(Apple)、科能軟件(Canonical)、雪佛龍(Chevron)、迪士尼(Disney)、臉書(Facebook)、通用電氣(GE)、谷歌(Google)、Heroku、微軟(Microsoft)、Twitch、威瑞森無線(Verizon)和沃爾瑪(Walmart)在內的公司都使用了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正在數據中心大放異彩,但它的應用場景並不僅限於工作區域。例如,Ron Evans和Adrian Zankich就創建了用於控制機器人和硬件的Gobot庫,而Alan Shreve則創建了以學習Go為目的的開發工具ngrok項目,並將該項目轉變成自己的全職事業。

為了向圖1-1所示的那隻無憂無慮的Go吉祥物表示敬意,社區中的Go擁護者通常會把自己稱為gopher(地鼠、囊地鼠)。雖然編程路上充滿著各式各樣的挑戰,但通過使用Go並閱讀本書,我們希望你能夠從中發現編程的樂趣。

GO編程語言是什麼?如何訪問Go Playground?

圖1-1 Renée French設計的Go地鼠吉祥物

本章將展示一個運行在Web瀏覽器中的Go程序,並基於該程序進行一些實驗。

請考慮這一點

像英語這樣的自然語言充斥著各式各樣模稜兩可的話。例如,當你向數字助理說出“Call me a cab”的時候,它是應該幫你致電出租車公司,還是應該假設你想要把自己的名字改成“a cab”?

清晰度對於編程語言永遠都是最重要的。假如編程語言的語法或者句法允許歧義存在,那麼計算機也許就無法完成人們指定的行為,這樣一來編程工作將變得毫無意義。

Go並不是一門完美的語言,但它在清晰度方面所做的努力遠超我們之前用過的所有語言。在學習本章內容的時候,你將會看到一些名詞縮寫以及行業術語。雖然一開始你可能會對某些內容感到陌生,但我們希望你可以多花些時間,字斟句酌,仔細體會Go是如何減少語言中的歧義的。

1.1 什麼是Go

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

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

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

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

——Rob Pike,Geek of the Week

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

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

——James Gosling,Java: an Overview

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

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

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

的軟件。

——Go品牌手冊

提示 當你在互聯網上搜索Go的相關話題時,可以使用關鍵字golang來代表Go語言。這種將-lang後綴添加到語言名字之後的做法也適用於其他編程語言,如Ruby、Rust等。


速查1-1 Go編譯器的兩個優點是什麼?

1.2 Go Playground

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

GO編程語言是什麼?如何訪問Go Playground?

圖1-2 Go Playground

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

注意 雖然本書列出的所有代碼和練習都可以通過Go Playground執行,但如果你更習慣使用文本編輯器和命令行,那麼你可以下載Go並安裝到你的計算機上。


速查1-2 Go Playground中的Run按鈕是用來做什麼的?

1.3 包和函數

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

代碼清單1-1 與Go Playground的初次見面:playground.go

package main  ←--- 聲明本代碼所屬的包import (    "fmt"  ←--- 導入fmt(是format的縮寫)包,使其可用)func main() {  ←--- 聲明一個名為main的函數    fmt.Println("Hello, playground")  ←--- 在屏幕上打印出“Hello, playground”} 

儘管這段代碼非常簡短,但它引入了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的這一特性可以讓用戶在閱讀代碼的時候立即弄清楚各個函數分別來自哪個包。

GO編程語言是什麼?如何訪問Go Playground?

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

速查1-3

1.Go程序從何處開始執行?

2.fmt包提供了什麼功能?

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

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

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

fmt.Println("Hello, fire hydrant");

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

GO編程語言是什麼?如何訪問Go Playground?

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

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

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

提示 在閱讀本書的時候,親力親為、不厭其煩地鍵入代碼清單中的每段代碼是一個不錯的主意。這樣一來,如果你鍵入了錯誤的代碼,就會看到相應的語法錯誤,但這並不是一件壞事。能夠識別、理解並糾正代碼中的錯誤是一項至關重要的技能,而且堅持不懈也是一種寶貴的品質。


速查1-4

用戶必須將左大括號{置於何處才能避免引起語法錯誤?

1.5 小結

  • 通過Go Playground,我們可以在不必安裝任何軟件的情況下開始使用Go。
  • 每個Go程序都由包中包含的函數組成。
  • 為了將文本輸出至屏幕,我們需要用到標準庫提供的fmt包。
  • 和自然語言一樣,編程語言中的標點符號也是至關重要的。
  • 到目前為止,我們已經使用了25個Go關鍵字中的3個,它們分別是:package、import和func。

為了檢驗你是否已經掌握了上述知識,請按照接下來展示的練習的要求修改Go Playground中的代碼,並點擊Run按鈕來查看結果。如果你在做練習的過程中遇到麻煩無法繼續下去,那麼可以通過刷新瀏覽器來讓代碼回到最初的狀態。

實驗:playground.go

  • 修改代碼中被引號包圍的文本,使得程序在將文本打印至屏幕時,可以用你的名字向你打招呼。
  • 在main函數的函數體{}內添加第二行代碼,使得程序可以打印出兩個文本行。就像這樣:fmt.Println("Hello, world") fmt.Println("Hello, 世界")
  • Go支持所有自然語言的字符。你可以嘗試讓程序用中文、日文、俄文甚至是西班牙文打印文本。如果你不懂上述提到的這些語言,那麼可以先通過谷歌翻譯工具進行翻譯,然後再把翻譯後的文本複製/粘貼到Go Playground。

你可以通過點擊Go Playground中的Share按鈕來獲得訪問當前代碼的鏈接,然後將該鏈接發佈至本書的論壇與其他讀者進行分享。

最後,你可以將你的解法和“習題答案”中給出的參考答案進行對比,從而判斷其是否正確。


速查1-1答案 Go編譯器可以在極短的時間內完成對大型程序的編譯,並且它可以在程序運行之前找出代碼中的一些人為失誤,如拼寫錯誤等。


速查1-2答案 Run按鈕可以在谷歌的服務器上編譯並執行用戶輸入的代碼。


速查1-3答案

1.Go程序從main包的main函數開始執行。

2.fmt包提供了用於格式化輸入和輸出的函數。


速查1-4答案 左大括號必須與func關鍵字位於同一行而不是獨佔一行,這是Go語言唯一允許的大括號放置風格。


分享到:


相關文章: