天天看點

GO語言系列之 初識go語言

          最近十年來,C/C++在計算領域沒有很好得到發展,并沒有新的系統程式設計語言出現。對開發程度和系統效率在很多情況下不能兼得。要麼執行效率高,但低效的開發和編譯,如C++;要麼執行低效,但擁有有效的編譯,如.NET、Java;是以需要一種擁有較高效的執行速度、編譯速度和開發速度的程式設計語言,Go就橫空出世了。

傳統的語言比如c++,大家花費太多時間來學習如何使用這門語言,而不是如何更好的表達寫作者的思想,同時編譯花費的時間實在太長,對于編寫-編譯-運作這個鍊條來說周期太長。動态語言如Python,由于沒有強類型的限制,很多問題需要在運作時發現,這種低級錯誤更應該交給編譯器來發現。

人力成本越來越高

機器越來越便宜

機器的性能越來越厲害

在開發效率和運作速度上達到平衡

go出現之前,無論彙編語言、還是動态腳本語言,在執行效率和開發效率上都不能兼備。

執行效率 execution speed: C/C++ > Java > PHP 開發效率 developing efficiency: PHP > Java > C/C++

        谷歌的“20%時間”工作方式,允許工程師拿出20%的時間來研究自己喜歡的項目。語音服務Google Now、谷歌新聞Google News、谷歌地圖Google Map上的交通資訊等,全都是20%時間的産物。Go語言最開始也是20%時間的産物。

Go的三個作者分别是: Rob Pike(羅伯.派克),Ken Thompson(肯.湯普森)和Robert Griesemer(羅伯特.格利茨默) 。

Rob Pike:曾是貝爾實驗室(Bell Labs)的Unix團隊,和Plan 9作業系統計劃的成員。他與Thompson共事多年,并共創出廣泛使用的UTF-8 字元編碼。

Ken Thompson:主要是B語言、C語言的作者、Unix之父。1983年圖靈獎(Turing Award)和1998年美國國家技術獎(National Medal of Technology)得主。他與Dennis Ritchie是Unix的原創者。Thompson也發明了後來衍生出C語言的B程式語言。

Robert Griesemer:在開發Go之前是Google V8、Chubby和HotSpot JVM的主要貢獻者。

GO語言系列之 初識go語言

此外還有Plan 9開發者Russ Cox、和曾改善目前廣泛使用之開原碼編譯器GCC的Ian Taylor。

        這是一封由 Rob Pike 在 2007 年 9 月 25 号,星期二,下午 3:12 回複給 Robert Griesemer、Ken Thompson 的有關程式設計語言讨論主題的郵件,郵件正文大意為:在開車回家的路上我得到了些靈感。1.給這門程式設計語言取名為“go”,它很簡短,易書寫。工具類可以命名為:goc、 gol、goa。互動式的調試工具也可以直接命名為“go”。語言檔案字尾名為 .go 等等

        這就是 Go 語言名字的來源,自此之後 Robert、Rob 和 Ken 三個人開始在 Google 内部進行了研發,一直到了 2009 年,Go 正式開源了,Go 項目團隊将 2009 年 11 月 10 日,即該語言正式對外開源的日字作為其官方生日。源代碼最初托管在 http://code.google.com 上,之後幾年才逐漸的遷移到 GitHub 上。

第一個事情是在開發設計 Go 語言過程中的第一個重大驚喜是收到了以下這封郵件:

GO語言系列之 初識go語言

這是一封由 Ian Lance Taylor 在 2008 年 6月 7 日(星期六)的晚上 7:06 寫給 Robert Griesemer、Rob Pike、 Ken Thompson 的關于 Go gcc 編譯器前端的郵件。郵件正文大意如下:我的同僚向我推薦了這個網站 http://…/go_lang.html 。這似乎是一門很有趣的程式設計語言。我為它寫了一個 gcc 編譯器前端。雖然這個工具仍缺少很多的功能,但它确實可以編譯網站上展示的那個素數篩選程式了。

Ian Lance Taylor 的加入以及第二個編譯器 (gcc go) 的實作 在帶來震驚的同時,也伴随着喜悅。這對 Go 項目來說不僅僅是鼓勵,更是一種對可行性的證明。語言的第二次實作對制定語言規範和确定标準庫的過程至關重要,同時也有助于保證其高可移植性,這也是 Go 語言承諾的一部分。自此之後 Ian Lance Taylor 成為了設計和實作 Go 語言及其工具的核心人物。

第二件事情是 Russ Cox 在2008年帶着他的語言設計天賦和程式設計技巧加入了剛成立不久的 Go 團隊。Russ 發現 Go 方法的通用性意味着函數也能擁有自己的方法,這直接促成了 http.HandlerFunc 的實作,這是一個讓 Go 一下子變得無限可能的特性。Russ 還提出了更多的泛化性的想法,比如 io.Reader 和 io.Writer 接口,奠定了所有 I/O 庫的整體結構。

第三件事情是聘請了安全專家 Adam Langley 幫助 Go 走向 Google 外面的世界。Adam 為 Go 團隊做了許多不為外人知曉的工作,包括建立最初的 http://golang.org 網站以及 build dashboard。不過他最大的貢獻當屬建立了 cryptographic 庫。起先,在我們中的部分人看來,這個庫無論在規模還是複雜度上都不成氣候。但是就是這個庫在後期成為了很多重要的網絡和安全軟體的基礎,并且成為了 Go 語言開發曆史的關鍵組成部分。許多網絡基礎設施公司,比如 Cloudflare,均重度依賴 Adam 在 Go 項目上的工作,網際網路也因它變得更好。我記得當初 beego 設計的時候,session 子產品設計的時候也得到了 Adam 的很多建議,是以,就 Go 而言,我們由衷地感謝 Adam。

第四個事情就是一家叫做 Docker 的公司。就是使用 Go 進行項目開發,并促進了計算機領域的容器行業,進而出現了像 Kubernetes 這樣的項目。現在,我們完全可以說 Go 是容器語言,這是另一個完全出乎意料的結果。

GO語言系列之 初識go語言

 除了大名鼎鼎的Docker,完全用GO實作。業界最為火爆的容器編排管理系統kubernetes完全用GO實作。之後的Docker Swarm,完全用GO實作。除此之外,還有各種有名的項目,如etcd/consul/flannel,七牛雲存儲等等 均使用GO實作。有人說,GO語言之是以出名,是趕上了雲時代。但為什麼不能換種說法?也是GO語言促使了雲的發展。

除了雲項目外,還有像今日頭條、UBER這樣的公司,他們也使用GO語言對自己的業務進行了徹底的重構。

       Go語言是谷歌2009年釋出的第二款開源程式設計語言(系統開發語言),它是基于編譯、垃圾收集和并發的程式設計語言。 Go語言專門針對多處理器系統應用程式的程式設計進行了優化,使用Go編譯的程式可以媲美 C / C++代碼的速度,而且更加安全、支援并行程序。作為出現在21世紀的語言,其近C的執行性能和近解析型語言的開發效率,以及近乎于完美的編譯速度,已經風靡全球。特别是在雲項目中,大部分都使用了Golang來開發。不得不說,Golang早已深入人心。而對于一個沒有曆史負擔的新項目,Golang或許就是個不二的選擇。 很多人将Go語言稱為21世紀的C語言,因為Go不僅擁有C的簡潔和性能。而且還很好的提供了21世紀網際網路環境下服務端開發的各種實用特性。被稱為Go語言之父的羅勃·派克(Rob Pike)就曾說過,你是否同意Go語言,取決于你是認可少就是多,還是少就是少(Less is more or less is less)。Go語言的整個設計哲學就是:将簡單、實用展現得淋漓盡緻。 如今 Go 已經是雲計算程式設計語言,GO語言背靠Google這棵大樹,又不乏牛人坐鎮,是名副其實的“牛二代”。想象一下:一個隻有十幾年發展經曆的程式設計語言,已經成為了如此巨大而且正在不斷發展的行業的主導者,這種成功是每個人都無法想象的。

一句話概括:天賦與背景并存,集性能和效率于一身的開發語言,有谷歌支援。

區塊鍊和容器化時代的到來,把Go語言也帶火了起來。除此之外,Go語言也被譽為 “21世紀的C語言”從性能和簡潔程度也比較優秀。

Go算是程式設計語言屆的優等生,集 <code>Python的簡潔</code> 和 <code>C語言的性能</code> 于一身,讓開發在保證性能的前提下更加高效。

Golang是一門編譯型、适用于大型項目開發的程式設計語言。關于Go語言可以簡單羅列他的幾個特點:

編譯型語言,寫完的代碼需要編譯成為二進制檔案再運作(預設靜态編譯),C語言也是需要先編譯再運作(預設動态編譯)。

并發程式設計,Go的并發方面比較優秀(其他語言其實也能做到,隻不過Go在編譯器級别而其他則更多的是使用者級别了)。

文法簡潔 &amp; 上手快,這點和Python比較相似,寫的代碼少可以做的事很多。

除此之外,Go在類型和異常等細節方面,讓他在編寫大型項目時更加占優勢。

a.記憶體自動回收,再也不需要開發人員管理記憶體

b.開發人員專注業務實作,降低了心智負擔

c.隻需要new配置設定記憶體,不需要釋放

a.從語言層面支援并發,非常簡單

b.goroute,輕量級線程,建立成千上萬個goroute成為可能

c.基于CSP(Commnuncating Sequential Process)模型并發

a.管道,類似unix/linux中的pipe

b.多個goroute之間通過channel進行通信

c.支援任何類型

Go 和 C語言、C++、Python、Java 等一樣都是程式設計語言。學習任何一門程式設計語言本質上都分3步走:

第一步:安裝 <code>解釋器 或 編譯器</code>。

第二步:學相關程式設計語言文法,然後寫代碼。

第三步:用已安裝<code>解釋器 或 編譯器</code> 去運作自己寫的代碼,這樣代碼就會去完成我們編寫的功能了。

Go是編譯型語言,是以我們一般稱Go安裝是<code>編譯器</code>。

Go是開源且跨平台的一門程式設計語言,是以他支援window、linux、mac作業系統,同時也意味着我們可以在各種系統中安裝Go的編譯器。

Linux

FreeBSD

Mac OS X(也稱為 Darwin)

Windows

去官網下載下傳安裝包,位址:https://golang.google.cn/dl/

GO語言系列之 初識go語言

下載下傳完成之後輕按兩下打開,然後根據提示點選下一步直至安裝成功,預設編譯器會安裝在: <code>C:\Go</code> 目錄。

GO語言系列之 初識go語言
GO語言系列之 初識go語言
GO語言系列之 初識go語言

至此編譯器就安裝在 <code>C:\Go</code>檔案夾了,并且安裝的過程中也把 <code>C:\Go\bin</code> 加入到系統的環境變量,是以在終端可以使用go version指令 。也可以安裝在其他檔案夾下。

為了開發項目友善和規範,在編譯器安裝成功之後,需要做如下幾項配置:

配置Go代碼目錄結構,為了友善管理以後自己開發的Go項目代碼,在自己硬碟上最好為Go先做寫目錄結構的處理。

GO語言系列之 初識go語言

配置相關環境變量

GO語言系列之 初識go語言

 GOROOT

           GOROOT為GO的安裝目錄,比如C:/GO,<code>GOROOT/bin</code>下包含Go為我們提供的工具鍊,是以應該将<code>GOROOT/bin</code>配置到環境變量PATH中,友善我們在全局中使用Go的工具鍊。使得可以在指令中直接使用Go相關指令。

 GOPATH

           GOPATH為Go的工作目錄,通常至少包含bin、pkg個src三個目錄

bin:主要存放可執行檔案。

pkg:存放編譯好的庫檔案, 主要是*.a檔案。現在主要存放go mod模式中下載下傳的封包件

src:下主要存放go的源檔案。

此外還需要注意的是不要講GOROOT設定城Go語言的路徑,避免出現不必要的沖突。

 GOBIN

           GOBIN是我們在開發程式編譯後二進制指令的安裝目錄。當我們使用go install指令編譯和打包應用程式時,該指令會将編譯後的二進制程式打包GOBIN目錄,一般我們将GOBIN設定為GOPATH/bin。

 GOPROXY

           GOPROXY為GO下載下傳包時的代理設定。對于golang 語言的開發,對于國内來說有點被動,需要想各種方法,一般的解決方法如下:

使用代理工具(FQ)

配置goproxy

GO語言系列之 初識go語言

在 GOPATH 下的 src 目錄中建立一個 <code>檔案夾(項目)</code>,進入檔案夾并建立一個以<code>.go</code>為字尾名的檔案(如 first.go),并在first.go檔案中寫入go代碼(可先用記事本編寫)。

編譯器安裝完成并且代碼也寫好之後,就可以使用Go編譯器去運作代碼了。

Go編譯器提供了3種方式讓我們來運作自己編寫的go程式代碼。

方式一:<code>go run</code> ,compile and run Go program ,其内部會【先編譯】代碼檔案【再運作】(二合一)。

方式二:<code>go build</code>,compile packages and dependencies,其内部就是将go代碼進行編譯,然後手動執行。

方式三:<code>go install</code>,compile and install packages and dependencies,其内部就是編譯go代碼,并将可執行檔案/封包件分别放到 bin 和 pkg目錄。

至此,Windows系統上進行Go編譯器的安裝就完成了。

https://golang.google.cn/

GO語言系列之 初識go語言

預設的安裝目錄:<code>/usr/local/go/</code>

編譯器啟動檔案:<code>/usr/local/go/bin/go</code>

此目錄以後放你寫的所有go代碼。

vim ~/.bash_profile

本質上就是讓Go編譯器去運作咱們編寫的代碼。

方式1:

方式2(推薦):

方式3:

啟動Go編譯器檔案:<code>/opt/go/bin/go</code>

存放咱們編寫的所有項目代碼,編譯檔案之後存放編譯後的檔案。

本質上将寫好的代碼交給Go編譯器去執行。

Go程式員的項目:

産出一個可執行檔案。

産出一個封包件。

hello world, 在gopath路徑下建立src目錄,建立檔案hello.go

在終端輸入go run hello.go,如何成功列印hello world則證明配置成功

   進入Goland官網:https://www.jetbrains.com/zh-cn/go/download/

GO語言系列之 初識go語言

  下載下傳最新版的Goland或者舊版本,輕按兩下安裝包運作安裝程式,按照提示完成安裝。然後網上搜尋對應版本的破解方法完成破解(僅供學習使用)。

  激活參考:https://shimo.im/docs/dKYCkd8PrX3ckX99/read

關于包管理的總結:

一個檔案夾可以稱為一個包。

在檔案夾(包)中可以建立多個檔案。

在同一個包下的每個為檔案中必須指定 <code>包名稱且相同</code>

重點:關于包的分類

main包,如果是main包,則必須寫一個main函數,此函數就是項目的入口(main主函數)。 編譯生成的就是一個可執行檔案。

非main包,用來将代碼進行分類,分别放在不同的包和檔案中。

GO語言系列之 初識go語言
GO語言系列之 初識go語言

注意:

調用其他包的功能,需要先 import 導入,然後再使用;調用自己包中的功能時,直接調用即可(無需導入)

檔案中的函數首字母是小寫,表示此函數隻能被目前包内部檔案調用。首字母是大寫,則意味着任何包都可以調用。

執行個體: 代碼目錄

GO語言系列之 初識go語言

add.go

sub.go

main.go

編譯

goroute.go

GO語言系列之 初識go語言
GO語言系列之 初識go語言

作者:張亞飛