《Go語言實戰》內容回顧與作者采訪

jopen 8年前發布 | 22K 次閱讀 Go語言

Go語言實戰 是曼寧新出版的一本技術書籍,目標是提供一個全面介紹Go語言的教程。內容包括語法介紹和內部實現,以及最常見的用法。InforQ借機采訪做本書的作者:William Kennedy。

一如曼寧的“實戰”系列,Go語言實戰秉承了以精簡的體積容納第一手的信息和深入語言內部的洞見。作者對于本書的定位是,擁有一定編程經驗但原來并沒有Go的基礎的中級開發者。

從而,本書的作者們熱衷于提供非常清晰的且對每個概念的細節解釋,所介紹的內容確保讀者能夠擁有必要的信息以全面的理解到位。關于此一個極為妥當的例子就是關于討論Go的內建數據類型-數組、切片和映射-在那里讀者不僅可以學習到如何使用它們,而且可了解它們是如何實現的,以及什么樣的情形下使用何種類型,舉例來說,什么時候切片或者什么時候用到切片的切片。對于有經驗的Go的開發者,此書亦有頗大的吸引力,當然這在書中的最后幾個章節才有所體現,最后覆蓋了一些高級的主題如常見的并發模式、剖析、調試、以及性能調優。

本書有9章的內容,它們分別是:

  • 解釋Go是什么,且提供了短小但完整的程序(章節1和2);
  • 介紹了包管理的概念,探討了項目的組織方式,以及Go所提供的工具(章節3);
  • 描述了一些Go內置的數據類型的細節,以及Go的類系統,包括接口和類型嵌入,Go對于C++虛擬和非虛擬繼承的另外一種方法。類型嵌入可以看作是自動化成份或委托的形式,嵌入的類型接口會自動通過嵌入類型拋出。接口提供了運行時的多態。(章節4);
  • 探索了Go的并發原語:goroutines,即允許在 輕量級進程 內部執行一個函數;頻道,即支持類型安全、在協程之間進行同步通信。除了goroutines和頻道之外,Go還支持內存共享和傳統的鎖原語。此外,一些高級的并發模式有基于頻道實現的看門狗,用來管理池的資源和掌管池中的工作者(章節6和7);
  • 介紹了Go的標準庫,聚焦于三個包: logjson 、和 io (章節8);
  • 向讀者展示了使用測試和基準工具,在文檔中如何添加示例代碼然后用它們來做測試(章節9)。

Go語言實戰包涵了超過100個的代碼實例,其中很多是從標準庫中提取出來的,所以用戶可以理解為此書提供了實際的例子,即Go是如何解決常見問題的。

InfoQ采訪了《Go語言實戰》的主要作者,William Kennedy。

InfoQ: 您能解釋下寫作此書的主要動機是什么嗎?有此必要嗎?

我早些時候寫的 博客 就是作為Go的初學者學習的地方。我嘗試去做到讀者并不是超出基礎知識水平的。當我被邀請參與此書的寫作時,我將之視為能夠在更大范圍內繼續我的認知。在本書寫作時,市面上只有兩本書出版了,而且它們正在變的過時。我在當初學習Go的時候讀過這兩本書,所以自我感覺以我的風格寫就的書可以帶來完全不同的視角。

2年過去了,我認為素材很好的覆蓋了一些不同的格式和書籍。我認為 Donovan和Kernighan的Go編程語言 和《Go語言實戰》是今天學習Go語言的機制、實現、規范最好的兩本書。

InfoQ: 您的書的目標讀者是有一些編程經驗的中級開發者,當他們閱讀此書時您有什么建議?什么是他們應該期望的?什么不應該期望?

這很難回答,但是最為重要的事情就是任何開始要學習Go的人應該持一種全新的眼光去看待Go。你學習Go就應該去按照此語言的所設計的思路去寫代碼。約定俗成的東西至關重要,這沒什么好說的。如果你能做到由語言團隊和社區所共同遵守的約定俗成的去寫代碼,就會事半功倍。如果你非得對著干,也可能讓程序運行起來,但是會錯過很多語言中一些讓人驚嘆的東西。

InfoQ:Go通常被描述為一種可編程的語言,您能總結下促進此種編程的方法嗎?Go的主要特征定義是什么?

其核心理念很簡單。編寫精簡的讓人容易閱讀的代碼。當事情變得簡單,Bug也會變少,更多的人可以參與進來,隨之而來的就是優化。你看到Go的語法是天生簡約的,而不是給人驚異。來自外部的語言不是天方夜譚也不會去嘗試,來自內部創新的軟件的語言則打破常規,為程序員建立了盡可能簡單而不是復雜的新局面。畢竟生產力才是程序員的一切。

InfoQ:高度支持并發是Go的重要特性之一,其擁抱CSP范式和goroutines。麻煩您描述下此模式給程序員們帶來的好處?和其它相關的并發模式比較起來呢?例如actors。

頻道是由Go引進的一項新的并發編程的工具。頻道提供了一種編排goroutines以執行工作流的方法。也提供對goroutines的友好機制以及Go運行時的調度方法。我認為actor機制也能夠在Go和頻道下很好的工作。Go并不能讓撰寫并發軟件變得簡單,我認為太多的人們過度的解讀了goroutines和頻道。畢竟它們只是工具,需要去用心學習并能夠正確的使用它們的。我知道頻道讓很多人來關注Go語言,但是讓人深入或使用Go還得看接口和composition以及語言的簡單性。

InfoQ:Go最近作了 替代大量的Python腳本 的工作。你認為這將會是一個主要的方向嘛?是Go的哪些特性讓這種替代成為可能?

我曾經花了兩年的時間作語言的教學工作,并有幸接觸的是一線的公司。我在我的班里教的編程語言有Python、Ruby、Java和C。我認為越來越多的被采用才是高效程序員所使用的語言。任何人都可以使用Go來寫代碼,但是寫出高質量代碼需要走好長的路。能夠有效的整合才是高效的表現。

InfoQ:Go摒棄了繼承和類型層次的想法,即我們眾所周知的OOP。然而,Go依然掌控著類型的組成和接口,看起來蠻有效果。您如何描述這一編程范式?在您個人使用Go的經驗中,有沒有感到,從另外的地方派生出的類型會更有幫助?

我認為Go的最大的優點是隱藏在接口之后機制和嵌入的部分,再加上編譯器的設計讓程序員更加簡單、高效的使用。Go是一門面向對象編程的語言,然而這并非是你去花所有時間去關注的部分。Go允許程序員利用已有的類型來重復使用和擴展它們。Go允許直觀的對接口編程且類型安全。此 視頻 或許可以幫助你了解這點。

來自composition的觀點,此 博客 講述了更多的細節。

我希望能夠有時間在書中寫一些關于composition的實例,在下個版本我會加入。

InfoQ:一個語言的成功與否,工具占據著很重要的位置。在您的書中,您聚焦于語言和它的標準庫,關于Go的可用的工具您持何種看法?

Go提供的工具是驚人的。語言團隊提供了你需要的調試和分析程序的一切。而且社區還構建了對語言團隊本身已經提供的進行了擴展的工具。這里有一些你可以瀏覽到的主題: testingBenchmarkingmemory traceschedule tracingstack trace

InfoQ:新近出現了一些語言呈競爭狀態,它們有:Go、Rust、D、Scala等。您認為Go能從它們中間脫穎而出嗎?

競爭是不存在的。每一種語言解決不同的問題,且它們是可以共存的,甚至是在同一技術棧中。我喜歡Rust,而且它頗具潛力。我認為語言的語法不一是人們需要花時間去切換的主要原因。我會學習Rust這門語言的。

官方站點 購買此書時使用代碼“goiaiq”,可獲得38%的優惠折扣。

您可以下載Go語言實戰的代碼示例,從而獲得此書的第一印象。

關于作者

William Kennedy 是來自佛羅里達州的邁阿密一家叫做Ardan Studios公司的管理合伙人,Ardan Studios是一家做移動、web應用和系統開發的公司,他是Go語言實戰的作者之一,博客GoingGo.net的作者,是邁阿密的Go和MangoDB小型線下聚會的組織者,Bill通過Ardan Labs,他新投資的科技公司,醉心于Go的教育與傳播,Bill也經常在一些研討會上發表演講,無論是在本地還是通過Hangout。他經常會找一些熱衷于Go的知識、博客、編碼技能的個體或團隊切磋。@goinggodotnet

查看英文原文: Go in Action - Review and Q&A with Author

來自: http://www.infoq.com/cn/articles/go-in-action-review

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!