<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 前言 *“Go是一個開源的編程語言,它很容易用于構建簡單、可靠和高效的軟件。”(摘自Go語言官方網站:http://golang.org )* Go語言由來自Google公司的[Robert Griesemer](http://research.google.com/pubs/author96.html),[Rob Pike](http://genius.cat-v.org/rob-pike/)和[Ken Thompson](http://genius.cat-v.org/ken-thompson/)三位大牛于2007年9月開始設計和實現,然后于2009年的11月對外正式發布(譯注:關于Go語言的創世紀過程請參考 http://talks.golang.org/2015/how-go-was-made.slide )。語言及其配套工具的設計目標是具有表達力,高效的編譯和執行效率,有效地編寫高效和健壯的程序。 Go語言有著和C語言類似的語法外表,和C語言一樣是專業程序員的必備工具,可以用最小的代價獲得最大的戰果。 但是它不僅僅是一個更新的C語言。它還從其他語言借鑒了很多好的想法,同時避免引入過度的復雜性。 Go語言中和并發編程相關的特性是全新的也是有效的,同時對數據抽象和面向對象編程的支持也很靈活。 Go語言同時還集成了自動垃圾收集技術用于更好地管理內存。 Go語言尤其適合編寫網絡服務相關基礎設施,同時也適合開發一些工具軟件和系統軟件。 但是Go語言確實是一個通用的編程語言,它也可以用在圖形圖像驅動編程、移動應用程序開發 和機器學習等諸多領域。目前Go語言已經成為受歡迎的作為無類型的腳本語言的替代者: 因為Go編寫的程序通常比腳本語言運行的更快也更安全,而且很少會發生意外的類型錯誤。 Go語言還是一個開源的項目,可以免費獲編譯器、庫、配套工具的源代碼。 Go語言的貢獻者來自一個活躍的全球社區。Go語言可以運行在類[UNIX](http://doc.cat-v.org/unix/)系統—— 比如[Linux](http://www.linux.org/)、[FreeBSD](https://www.freebsd.org/)、[OpenBSD](http://www.openbsd.org/)、[Mac OSX](http://www.apple.com/cn/osx/)——和[Plan9](http://plan9.bell-labs.com/plan9/)系統和[Microsoft Windows](https://www.microsoft.com/zh-cn/windows/)操作系統之上。 Go語言編寫的程序無需修改就可以運行在上面這些環境。 本書是為了幫助你開始以有效的方式使用Go語言,充分利用語言本身的特性和自帶的標準庫去編寫清晰地道的Go程序。 ### Go語言起源 編程語言的演化就像生物物種的演化類似,一個成功的編程語言的后代一般都會繼承它們祖先的優點;當然有時多種語言雜合也可能會產生令人驚訝的特性;還有一些激進的新特性可能并沒有先例。我們可以通過觀察編程語言和軟硬件環境是如何相互促進、相互影響的演化過程而學到很多。 下圖展示了有哪些早期的編程語言對Go語言的設計產生了重要影響。 ![](https://box.kancloud.cn/2016-01-10_5691fbe222a12.png) Go語言有時候被描述為“C類似語言”,或者是“21世紀的C語言”。Go從C語言繼承了相似的表達式語法、控制流結構、基礎數據類型、調用參數傳值、指針等很多思想,還有C語言一直所看中的編譯后機器碼的運行效率以及和現有操作系統的無縫適配。 但是在Go語言的家族樹中還有其它的祖先。其中一個有影響力的分支來自[Niklaus Wirth](https://en.wikipedia.org/wiki/Niklaus_Wirth)所設計的[Pascal](https://en.wikipedia.org/wiki/Pascal_(programming_language))語言。然后[Modula-2](https://en.wikipedia.org/wiki/Modula-2)語言激發了包的概念。然后[Oberon](https://en.wikipedia.org/wiki/Oberon_(programming_language))語言摒棄了模塊接口文件和模塊實現文件之間的區別。第二代的[Oberon-2](https://en.wikipedia.org/wiki/Oberon-2_(programming_language))語言直接影響了包的導入和聲明的語法,還有[Oberon](https://en.wikipedia.org/wiki/Oberon_(programming_language))語言的面向對象特性所提供的方法的聲明語法等。 Go語言的另一支祖先,帶來了Go語言區別其他語言的重要特性,靈感來自于貝爾實驗室的[Tony Hoare](https://en.wikipedia.org/wiki/Tony_Hoare)于1978年發表的鮮為外界所知的關于并發研究的基礎文獻 *順序通信進程* ( *[communicating sequential processes](https://en.wikipedia.org/wiki/Communicating_sequential_processes)* ,縮寫為[CSP](https://en.wikipedia.org/wiki/Communicating_sequential_processes)。在[CSP](https://en.wikipedia.org/wiki/Communicating_sequential_processes)中,程序是一組中間沒有共享狀態的平行運行的處理過程,它們之間使用管道進行通信和控制同步。不過[Tony Hoare](https://en.wikipedia.org/wiki/Tony_Hoare)的[CSP](https://en.wikipedia.org/wiki/Communicating_sequential_processes)只是一個用于描述并發性基本概念的描述語言,并不是一個可以編寫可執行程序的通用編程語言。 接下來,Rob Pike和其他人開始不斷嘗試將[CSP](https://en.wikipedia.org/wiki/Communicating_sequential_processes)引入實際的編程語言中。他們第一次嘗試引入[CSP](https://en.wikipedia.org/wiki/Communicating_sequential_processes)特性的編程語言叫[Squeak](http://doc.cat-v.org/bell_labs/squeak/)(老鼠間交流的語言),是一個提供鼠標和鍵盤事件處理的編程語言,它的管道是靜態創建的。然后是改進版的[Newsqueak](http://doc.cat-v.org/bell_labs/squeak/)語言,提供了類似C語言語句和表達式的語法和類似[Pascal](https://en.wikipedia.org/wiki/Pascal_(programming_language))語言的推導語法。Newsqueak是一個帶垃圾回收的純函數式語言,它再次針對鍵盤、鼠標和窗口事件管理。但是在Newsqueak語言中管道是動態創建的,屬于第一類值, 可以保存到變量中。 在Plan9操作系統中,這些優秀的想法被吸收到了一個叫[Alef](http://doc.cat-v.org/plan_9/2nd_edition/papers/alef/)的編程語言中。Alef試圖將Newsqueak語言改造為系統編程語言,但是因為缺少垃圾回收機制而導致并發編程很痛苦。(譯注:在Aelf之后還有一個叫[Limbo](http://doc.cat-v.org/inferno/4th_edition/limbo_language/)的編程語言,Go語言從其中借鑒了很多特性。 具體請參考Pike的講稿:http://talks.golang.org/2012/concurrency.slide#9 ) Go語言的其他的一些特性零散地來自于其他一些編程語言;比如iota語法是從[APL](https://en.wikipedia.org/wiki/APL_(programming_language))語言借鑒,詞法作用域與嵌套函數來自于[Scheme](https://en.wikipedia.org/wiki/Scheme_(programming_language))語言(和其他很多語言)。當然,我們也可以從Go中發現很多創新的設計。比如Go語言的切片為動態數組提供了有效的隨機存取的性能,這可能會讓人聯想到鏈表的底層的共享機制。還有Go語言新發明的defer語句。 ### Go語言項目 所有的編程語言都反映了語言設計者對編程哲學的反思,通常包括之前的語言所暴露的一些不足地方的改進。Go項目是在Google公司維護超級復雜的幾個軟件系統遇到的一些問題的反思(但是這類問題絕不是Google公司所特有的)。 正如[Rob Pike](http://genius.cat-v.org/rob-pike/)所說,“軟件的復雜性是乘法級相關的”,通過增加一個部分的復雜性來修復問題通常將慢慢地增加其他部分的復雜性。通過增加功能和選項和配置是修復問題的最快的途徑,但是這很容易讓人忘記簡潔的內涵,即使從長遠來看,簡潔依然是好軟件的關鍵因素。 簡潔的設計需要在工作開始的時候舍棄不必要的想法,并且在軟件的生命周期內嚴格區別好的改變或壞的改變。通過足夠的努力,一個好的改變可以在不破壞原有完整概念的前提下保持自適應,正如[Fred Brooks](http://www.cs.unc.edu/~brooks/)所說的“概念完整性”;而一個壞的改變則不能達到這個效果,它們僅僅是通過膚淺的和簡單的妥協來破壞原有設計的一致性。只有通過簡潔的設計,才能讓一個系統保持穩定、安全和持續的進化。 Go項目包括編程語言本身,附帶了相關的工具和標準庫,最后但并非代表不重要的,關于簡潔編程哲學的宣言。就事后諸葛的角度來看,Go語言的這些地方都做的還不錯:擁有自動垃圾回收、一個包系統、函數作為一等公民、詞法作用域、系統調用接口、只讀的UTF8字符串等。但是Go語言本身只有很少的特性,也不太可能添加太多的特性。例如,它沒有隱式的數值轉換,沒有構造函數和析構函數,沒有運算符重載,沒有默認參數,也沒有繼承,沒有泛型,沒有異常,沒有宏,沒有函數修飾,更沒有線程局部存儲。但是語言本身是成熟和穩定的,而且承諾保證向后兼容:用之前的Go語言編寫程序可以用新版本的Go語言編譯器和標準庫直接構建而不需要修改代碼。 Go語言有足夠的類型系統以避免動態語言中那些粗心的類型錯誤,但是Go語言的類型系統相比傳統的強類型語言又要簡潔很多。雖然有時候這會導致一個“無類型”的抽象類型概念,但是Go語言程序員并不需要像C++或Haskell程序員那樣糾結于具體類型的安全屬性。在實踐中Go語言簡潔的類型系統給了程序員帶來了更多的安全性和更好的運行時性能。 Go語言鼓勵當代計算機系統設計的原則,特別是局部的重要性。它的內置數據類型和大多數的準庫數據結構都經過精心設計而避免顯式的初始化或隱式的構造函數,因為很少的內存分配和內存初始化代碼被隱藏在庫代碼中了。Go語言的聚合類型(結構體和數組)可以直接操作它們的元素,只需要更少的存儲空間、更少的內存分配,而且指針操作比其他間接操作的語言也更有效率。由于現代計算機是一個并行的機器,Go語言提供了基于CSP的并發特性支持。Go語言的動態棧使得輕量級線程goroutine的初始棧可以很小,因此創建一個goroutine的代價很小,創建百萬級的goroutine完全是可行的。 Go語言的標準庫(通常被稱為語言自帶的電池),提供了清晰的構建模塊和公共接口,包含I/O操作、文本處理、圖像、密碼學、網絡和分布式應用程序等,并支持許多標準化的文件格式和編解碼協議。庫和工具使用了大量的約定來減少額外的配置和解釋,從而最終簡化程序的邏輯,而且每個Go程序結構都是如此的相似,因此Go程序也很容易學習。使用Go語言自帶工具構建Go語言項目只需要使用文件名和標識符名稱, 一個偶爾的特殊注釋來確定所有的庫、可執行文件、測試、基準測試、例子、以及特定于平臺的變量、項目的文檔等;Go語言源代碼本身就包含了構建規范。 ### 本書的組織 我們假設你已經有一種或多種其他編程語言的使用經歷,不管是類似C、c++或Java的編譯型語言,還是類似Python、Ruby、JavaScript的腳本語言,因此我們不會像對完全的編程語言初學者那樣解釋所有的細節。因為Go語言的變量、常量、表達式、控制流和函數等基本語法也是類似的。 第一章包含了本教程的基本結構,通過十幾個程序介紹了用Go語言如何實現 類似讀寫文件、文本格式化、創建圖像、網絡客戶端和服務器通訊等日常工作。 第二章描述了Go語言程序的基本元素結構、變量、新類型定義、包和文件、以及作用域的概念。第三章討論了數字、布爾值、字符串和常量,并演示了如何顯示和處理Unicode字符。第四章描述了復合類型,從簡單的數組、字典、切片到動態列表。第五章涵蓋了函數,并討論了錯誤處理、panic和recover,還有defer語句。 第一章到第五章是基礎部分,主流命令式編程語言這部分都類似。個別之處,Go語言有自己特色的語法和風格,但是大多數程序員能很快適應。其余章節是Go語言特有的:方法、接口、并發、包、測試和反射等語言特性。 Go語言的面向對象機制與一般語言不同。它沒有類層次結構,甚至可以說沒有類;僅僅通過組合(而不是繼承)簡單的對象來構建復雜的對象。方法不僅可以定義在結構體上, 而且可以定義在任何用戶自定義的類型上;并且具體類型和抽象類型(接口)之間的關系是隱式的,所以很多類型的設計者可能并不知道該類型到底實現了哪些接口。方法在第六章討論,接口在第七章討論。 第八章討論了基于順序通信進程(CSP)概念的并發編程,使用goroutines和channels處理并發編程。第九章則討論了傳統的基于共享變量的并發編程。 第十章描述了包機制和包的組織結構。這一章還展示了如何有效的利用Go自帶的工具,使用單個命令完成編譯、測試、基準測試、代碼格式化、文檔以及其他諸多任務。 第十一章討論了單元測試,Go語言的工具和標準庫中集成了輕量級的測試功能,避免了強大但復雜的測試框架。測試庫提供了一些基本構件,必要時可以用來構建復雜的測試構件。 第十二章討論了反射,一種程序在運行期間審視自己的能力。反射是一個強大的編程工具,不過要謹慎地使用;這一章利用反射機制實現一些重要的Go語言庫函數, 展示了反射的強大用法。第十三章解釋了底層編程的細節,在必要時,可以使用unsafe包繞過Go語言安全的類型系統。 部分章節的后面有練習題,根據對Go語言的理解修改書中的例子來探索Go語言的用法。 書中所有的代碼都可以從 http://gopl.io 上的Git倉庫下載。go get命令根據每個例子的導入路徑智能地獲取、構建并安裝。只需要選擇一個目錄作為工作空間,然后將GOPATH環境變量設置為該路徑。 必要時,Go語言工具會創建目錄。例如: ~~~ $ export GOPATH=$HOME/gobook # 選擇工作目錄 $ go get gopl.io/ch1/helloworld # 獲取/編譯/安裝 $ $GOPATH/bin/helloworld # 運行程序 Hello, 世界 # 這是中文 ~~~ 運行這些例子需要安裝Go1.5以上的版本。 ~~~ $ go version go version go1.5 linux/amd64 ~~~ 如果使用其他的操作系統, 請參考 https://golang.org/doc/install 提供的說明安裝。 ### 更多的信息 最佳的幫助信息來自Go語言的官方網站,https://golang.org ,它提供了完善的參考文檔,包括編程語言規范和標準庫等諸多權威的幫助信息。同時也包含了如何編寫更地道的Go程序的基本教程,還有各種各樣的在線文本資源和視頻資源,它們是本書最有價值的補充。Go語言的官方博客 https://blog.golang.org 會不定期發布一些Go語言最好的實踐文章,包括當前語言的發展狀態、未來的計劃、會議報告和Go語言相關的各種會議的主題等信息(譯注: http://talks.golang.org/ 包含了官方收錄的各種報告的講稿)。 在線訪問的一個有價值的地方是可以從web頁面運行Go語言的程序(而紙質書則沒有這么便利了)。這個功能由來自 https://play.golang.org 的 Go Playground 提供,并且可以方便地嵌入到其他頁面中,例如 https://golang.org 的主頁,或 godoc 提供的文檔頁面中。 Playground可以簡單的通過執行一個小程序來測試對語法、語義和對程序庫的理解,類似其他很多語言提供的REPL即時運行的工具。同時它可以生成對應的url,非常適合共享Go語言代碼片段,匯報bug或提供反饋意見等。 基于 Playground 構建的 Go Tour,https://tour.golang.org ,是一個系列的Go語言入門教程,它包含了諸多基本概念和結構相關的并可在線運行的互動小程序。 當然,Playground 和 Tour 也有一些限制,它們只能導入標準庫,而且因為安全的原因對一些網絡庫做了限制。如果要在編譯和運行時需要訪問互聯網,對于一些更復雜的實驗,你可能需要在自己的電腦上構建并運行程序。幸運的是下載Go語言的過程很簡單,從 https://golang.org 下載安裝包應該不超過幾分鐘(譯注:感謝偉大的長城,讓大陸的Gopher們都學會了自己打洞的基本生活技能,下載時間可能會因為洞的大小等因素從幾分鐘到幾天或更久),然后就可以在自己電腦上編寫和運行Go程序了。 Go語言是一個開源項目,你可以在 https://golang.org/pkg 閱讀標準庫中任意函數和類型的實現代碼,和下載安裝包的代碼完全一致。這樣你可以知道很多函數是如何工作的, 通過挖掘找出一些答案的細節,或者僅僅是出于欣賞專業級Go代碼。 ### 致謝 [Rob Pike](http://genius.cat-v.org/rob-pike/)和[Russ Cox](http://research.swtch.com/),以及很多其他Go團隊的核心成員多次仔細閱讀了本書的手稿,他們對本書的組織結構和表述用詞等給出了很多寶貴的建議。在準備日文版翻譯的時候,Yoshiki Shibata更是仔細地審閱了本書的每個部分,及時發現了諸多英文和代碼的錯誤。我們非常感謝本書的每一位審閱者,并感謝對本書給出了重要的建議的Brian Goetz、Corey Kosak、Arnold Robbins、Josh Bleecher Snyder和Peter Weinberger等人。 我們還感謝Sameer Ajmani、Ittai Balaban、David Crawshaw、Billy Donohue、Jonathan Feinberg、Andrew Gerrand、Robert Griesemer、John Linderman、Minux Ma(譯注:中國人,Go團隊成員。)、Bryan Mills、Bala Natarajan、Cosmos Nicolaou、Paul Staniforth、Nigel Tao(譯注:好像是陶哲軒的兄弟)以及Howard Trickey給出的許多有價值的建議。我們還要感謝David Brailsford和Raph Levien關于類型設置的建議。 我們的來自Addison-Wesley的編輯Greg Doench收到了很多幫助,從最開始就得到了越來越多的幫助。來自AW生產團隊的John Fuller、Dayna Isley、Julie Nahil、Chuti Prasertsith到Barbara Wood,感謝你們的熱心幫助。 [Alan Donovan](https://github.com/adonovan)特別感謝:Sameer Ajmani、Chris Demetriou、Walt Drummond和Google公司的Reid Tatge允許他有充裕的時間去寫本書;感謝Stephen Donovan的建議和始終如一的鼓勵,以及他的妻子Leila Kazemi并沒有讓他為了家庭瑣事而分心,并熱情堅定地支持這個項目。 [Brian Kernighan](http://www.cs.princeton.edu/~bwk/)特別感謝:朋友和同事對他的耐心和寬容,讓他慢慢地梳理本書的寫作思路。同時感謝他的妻子Meg和其他很多朋友對他寫作事業的支持。 2015年 10月 于 紐約
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看