Go語言編程

Go語言編程 pdf epub mobi txt 電子書 下載 2025

許式偉 等 著
圖書標籤:
  • Go語言
  • 編程
  • 開發
  • 軟件工程
  • 計算機科學
  • 技術
  • 入門
  • 實戰
  • 算法
  • 數據結構
想要找書就要到 靜思書屋
立刻按 ctrl+D收藏本頁
你會得到大驚喜!!
齣版社: 人民郵電齣版社
ISBN:9787115290366
版次:1
商品編碼:11067810
包裝:平裝
叢書名: 圖靈原創
開本:16開
齣版時間:2012-08-01
用紙:膠版紙
頁數:245
正文語種:中文

具體描述

編輯推薦

  

  《Go語言編程》首先概覽瞭Go語言的誕生和發展曆程,從麵嚮過程編程特性入手介紹Go語言的基礎用法,讓有一定C語言基礎的讀者可以非常迅速地入門並開始上手用Go語言來解決實際問題,之後介紹瞭Go語言簡潔卻又無比強大的麵嚮對象編程特性和並發編程能力,至此讀者已經可以理解為什麼Go語言是為互聯網時代而生的語言。
  從實用性角度齣發,本書還介紹瞭Go語言標準庫和配套工具的用法,包括安全編程、網絡編程、工程管理工具等。
  對於希望對Go語言有更深入瞭解的讀者,我們也特彆組織瞭一係列進階話題,包括語言交互性、鏈接符號、goroutine機理和接口機製等。

內容簡介

  在C語言和Unix操作係統發布40年後,肯·湯普森等貝爾實驗室原班人馬終於推齣瞭一門全新的編程語言,它就是Go語言。Go語言凝聚瞭該團隊將近半個世紀對計算機工程的思考成果,被稱為互聯網時代的C語言。自Go語言頭一次發布以來,七牛雲存儲團隊就非常密切地關注這門語言的發展,並率先在七牛的産品中進行大麵積的應用,而開發效率和係統穩定性等客觀數據也在持續證明我們選擇Go語言的正確性。因此,我們迫不及待地希望嚮同行們分享這門語言,大傢一起來享受Go語言所帶來的極大樂趣,也一起來促進這門語言的發展吧!
  《Go語言編程》首先概覽瞭Go語言的誕生和發展曆程,從麵嚮過程編程特性入手介紹Go語言的基礎用法,讓有一定C語言基礎的讀者可以非常迅速地入門並開始上手用Go語言來解決實際問題,之後介紹瞭Go語言簡潔卻又無比強大的麵嚮對象編程特性和並發編程能力,至此讀者已經可以理解為什麼Go語言是為互聯網時代而生的語言。從實用性角度齣發,本書還介紹瞭Go語言標準庫和配套工具的用法,包括安全編程、網絡編程、工程管理工具等。對於希望對Go語言有更深入瞭解的讀者,我們也特彆組織瞭一係列進階話題,包括語言交互性、鏈接符號、goroutine機理和接口機製等。《Go語言編程》適閤所有層次的開發者閱讀。

作者簡介

  許式偉,七牛雲存儲CEO,曾任盛大創新院資深研究員、金山軟件技術總監、WPS Office 2005首席架構師。開源愛好者,發布過包括WINX、TPL等十餘個C++開源項目,擁有超過15年的C/C++開發經驗。在接觸Go語言後即可被其大道至簡、少即是多的設計哲學所傾倒。七牛雲存儲是國內頭一個吃螃蟹的團隊,核心服務完全采用Go語言實現。

  呂桂華,七牛雲存儲聯閤創始人,曾在金山軟件、盛大遊戲等公司擔任架構師和部門經理等職務,在企業級係統和大型網遊平颱領域有較多涉獵。擁有十餘年的C/C++大型項目開發經驗,也曾在Java和.NET平颱上探索多年。同樣被Go語言的魅力所吸引而不可自拔,希望能為推廣這門優秀的語言盡自己的綿薄之力。

精彩書評

  Go語言具有簡潔有力的語言錶達能力、強大的係統開發能力、極高的運行效率、卓越的並發和並行能力、優秀的工程管理支持,以及美好的編程體驗。我們曾經在其他語言中花費大量氣力纔能獲得的一些能力,在Go中可以輕鬆得到。
  許式偉在Go語言齣現後很快就把它用於大型項目,帶領七牛團隊積纍瞭大量Go編程經驗。這本書除瞭完整介紹Go語言特性以外,還深入剖析瞭語言實現機製。作為服務器軟件開發者和編程語言愛好者,我強烈推薦此書。
  ——李傑,盛大文學首席架構師

  我一直認為Go語言是一門愉快的語言,代碼簡潔,開發高效,無論是slice還是reader、writer,處處都讓人舒坦,但是很多coder認為Go隻是驚鴻一瞥,無法探其究竟。而《Go語言編程》正是這樣一份猛料,能夠帶領越來越多的人瞭解Go,學習Go,用Go來實現自己的夢想。
  ——何曉傑,國內知名Android研究者,安居客移動事業部高級開發經理

  就個人學習Go語言的體會來說,在眾多編程語言中,它絕對屬於無法讓人一見鍾情的那類,然而當放下偏見與傲慢,真心地去瞭解和體會它的時候,Go語言就如同一壇古酒、一餅老茶,總是能在某些地方觸動開發者的心弦。
  《Go語言編程》這本書應當說是作者多年編程經驗的沉澱和反思。通過Go語言構建的“七牛雲存儲平颱”項目,對這些沉澱和反思進行瞭實踐和驗證,最終形成文字總結。Go語言作為一個工程化的編程語言,正是需要這樣以工程化思想為依托的圖書來嚮世人展示其優雅之處。本書一方麵通過展示和分析大量Go語言代碼,闡明瞭Go語言基本的使用方式,另一方麵通過和C語言代碼進行比較,進一步剖析瞭語言的內在設計思想,乃至底層實現原理,讓各個層次的讀者都能從書中汲取到大量的知識,使人讀後必有所得。
  簡單來說:好書,值得讀!
  ——邢星,Go語言社區積極推動者,39健康網技術部副總監

目錄

第1章  初識Go語言
1.1  語言簡史
1.2  語言特性
1.2.1  自動垃圾迴收
1.2.2  更豐富的內置類型
1.2.3  函數多返迴值
1.2.4  錯誤處理
1.2.5  匿名函數和閉包
1.2.6  類型和接口
1.2.7  並發編程
1.2.8  反射
1.2.9  語言交互性
1.3  第一個Go程序
1.3.1  代碼解讀
1.3.2  編譯環境準備
1.3.3  編譯程序
1.4  開發工具選擇
1.5  工程管理
1.6  問題追蹤和調試
1.6.1  打印日誌
1.6.2  GDB調試
1.7  如何尋求幫助
1.7.1  郵件列錶
1.7.2  網站資源
1.8  小結

第2章  順序編程
2.1  變量
2.1.1  變量聲明
2.1.2  變量初始化
2.1.3  變量賦值
2.1.4  匿名變量
2.2  常量
2.2.1  字麵常量
2.2.2  常量定義
2.2.3  預定義常量
2.2.4  枚舉
2.3  類型
2.3.1  布爾類型
2.3.2  整型
2.3.3  浮點型
2.3.4  復數類型
2.3.5  字符串
2.3.6  字符類型
2.3.7  數組
2.3.8  數組切片
2.3.9  map
2.4  流程控製
2.4.1  條件語句
2.4.2  選擇語句
2.4.3  循環語句
2.4.4  跳轉語句
2.5  函數
2.5.1  函數定義
2.5.2  函數調用
2.5.3  不定參數
2.5.4  多返迴值
2.5.5  匿名函數與閉包
2.6  錯誤處理
2.6.1  error接口
2.6.2  defer
2.6.3  panic()和recover()
2.7  完整示例
2.7.1  程序結構
2.7.2  主程序
2.7.3  算法實現
2.7.4  主程序
2.7.5  構建與執行
2.8  小結

第3章  麵嚮對象編程
3.1  類型係統
3.1.1  為類型添加方法
3.1.2  值語義和引用語義
3.1.3  結構體
3.2  初始化
3.3  匿名組閤
3.4  可見性
3.5  接口
3.5.1  其他語言的接口
3.5.2  非侵入式接口
3.5.3  接口賦值
3.5.4  接口查詢
3.5.5  類型查詢
3.5.6  接口組閤
3.5.7  Any類型
3.6  完整示例
3.6.1  音樂庫
3.6.2  音樂播放
3.6.3  主程序
3.6.4  構建運行
3.6.5  遺留問題
3.7  小結

第4章  並發編程
4.1  並發基礎
4.2  協程
4.3  goroutine
4.4  並發通信
4.5  channel
4.5.1  基本語法
4.5.2  select
4.5.3  緩衝機製
4.5.4  超時機製
4.5.5  channel的傳遞
4.5.6  單嚮channel
4.5.7  關閉channel
4.6  多核並行化
4.7  齣讓時間片
4.8  同步
4.8.1  同步鎖
4.8.2  全局唯一性操作
4.9  完整示例
4.9.1  簡單IPC框架
4.9.2  中央服務器
4.9.3  主程序
4.9.4  運行程序
4.10  小結

第5章  網絡編程
5.1  Socket編程
5.1.1  Dial()函數
5.1.2  ICMP示例程序
5.1.3  TCP示例程序
5.1.4  更豐富的網絡通信
5.2  HTTP編程
5.2.1  HTTP客戶端
5.2.2  HTTP服務端
5.3  RPC編程
5.3.1  Go語言中的RPC支持與處理
5.3.2  Gob簡介
5.3.3  設計優雅的RPC接口
5.4  JSON處理
5.4.1  編碼為JSON格式
5.4.2  解碼JSON數據
5.4.3  解碼未知結構的JSON數據
5.4.4  JSON的流式讀寫
5.5  網站開發
5.5.1  最簡單的網站程序
5.5.2  net/http包簡介
5.5.3  開發一個簡單的相冊網站
5.6  小結

第6章  安全編程
6.1  數據加密
6.2  數字簽名
6.3  數字證書
6.4  PKI體係
6.5  Go語言的哈希函數
6.6  加密通信
6.6.1  加密通信流程
6.6.2  支持HTTPS的Web服務器
6.6.3  支持HTTPS的文件服務器
6.6.4  基於SSL/TLS的ECHO程序
6.7  小結

第7章  工程管理
7.1  Go命令行工具
7.2  代碼風格
7.2.1  強製性編碼規範
7.2.2  非強製性編碼風格建議
7.3  遠程import支持
7.4  工程組織
7.4.1  GOPATH
7.4.2  目錄結構
7.5  文檔管理
7.6  工程構建
7.7  跨平颱開發
7.7.1  交叉編譯
7.7.2  Android支持
7.8  單元測試
7.9  打包分發
7.10  小結

第8章  開發工具
8.1  選擇開發工具
8.2  gedit
8.2.1  語法高亮
8.2.2  編譯環境
8.3  Vim
8.4  Eclipse
8.5  Notepad++
8.5.1  語法高亮
8.5.2  編譯環境
8.6  LiteIDE
8.7  小結

第9章  進階話題
9.1  反射
9.1.1  基本概念
9.1.2  基本用法
9.1.3  對結構的反射操作
9.2  語言交互性
9.2.1  類型映射
9.2.2  字符串映射
9.2.3  C程序
9.2.4  函數調用
9.2.5  編譯Cgo
9.3  鏈接符號
9.4  goroutine機理
9.4.1  協程
9.4.2  協程的C語言實現
9.4.3  協程庫概述
9.4.4  任務
9.4.5  任務調度
9.4.6  上下文切換
9.4.7  通信機製
9.5  接口機理
9.5.1  類型賦值給接口
9.5.2  接口查詢
9.5.3  接口賦值
附錄A

前言/序言

  為什麼我們需要一門新語言
  編程語言已經非常多,偏性能敏感的編譯型語言有 C、C++、Java、C#、Delphi和Objective-C等,偏快速業務開發的動態解析型語言有 PHP、Python、Perl、Ruby、JavaScript和Lua等,麵嚮特定領域的語言有 Erlang、R和MATLAB等,那麼我們為什麼需要 Go這樣一門新語言呢?
  在2000年前的單機時代, C語言是編程之王。隨著機器性能的提升、軟件規模與復雜度的提高,Java逐步取代瞭C的位置。盡管看起來 Java已經深獲人心,但 Java編程的體驗並未盡如人意。曆年來的編程語言排行榜(如圖 0-1所示)顯示, Java語言的市場份額在逐步下跌,並趨近於 C語言的水平,顯示瞭這門語言後勁不足。
  圖0-1編程語言排行榜①
  Go語言官方自稱,之所以開發 Go語言,是因為“近 10年來開發程序之難讓我們有點沮喪”。這一定位暗示瞭 Go語言希望取代 C和Java的地位,成為最流行的通用開發語言。 Go希望成為互聯網時代的 C語言。多數係統級語言(包括 Java和C#)的根本編程哲學來源於
  ——————————
  ① 據來源: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html。
  C++,將C++的麵嚮對象進一步發揚光大。但是Go語言的設計者卻有不同的看法,他們認為C++ 真的沒啥好學的,值得學習的是 C語言。C語言經久不衰的根源是它足夠簡單。因此, Go語言也要足夠簡單!
  那麼,互聯網時代的 C語言需要考慮哪些關鍵問題呢?首先,並行與分布式支持。多核化和集群化是互聯網時代的典型特徵。作為一個互聯網時代的C語言,必須要讓這門語言操作多核計算機與計算機集群如同操作單機一樣容易。其次,軟件工程支持。工程規模不斷擴大是産業發展的必然趨勢。單機時代語言可以隻關心問題本身的解決,而互聯網時代的 C語言還需要考慮軟件品質保障和團隊協作相關的話題。最後,編程哲學的重塑。計算機軟件經曆瞭數十年的發展,形成瞭麵嚮對象等多種學術流派。什麼纔是最佳的編程實踐?作為互聯網時代的 C語言,需要迴答這個問題。接下來我們來聊聊 Go語言在這些話題上是如何應對的。
  並發與分布式
  多核化和集群化是互聯網時代的典型特徵,那語言需要哪些特性來應對這些特徵呢?第一個話題是並發執行的“執行體”。執行體是個抽象的概念,在操作係統層麵有多個概念與之對應,比如操作係統自己掌管的進程( process)、進程內的綫程( thread)以及進程內的協程
  (coroutine,也叫輕量級綫程)。多數語言在語法層麵並不直接支持協程,而通過庫的方式支持的協程的功能也並不完整,比如僅僅提供協程的創建、銷毀與切換等能力。如果在這樣的協程中調用一個同步 IO操作,比如網絡通信、本地文件讀寫,都會阻塞其他的並發執行協程,從而無法真正達到協程本身期望達到的目標。
  Go語言在語言級彆支持協程,叫 goroutine。Go語言標準庫提供的所有係統調用( syscall)操作,當然也包括所有同步 IO操作,都會齣讓 CPU給其他goroutine,這讓事情變得非常簡單。我們對比一下Java和Go,近距離觀摩下兩者對“執行體”的支持。
  為瞭簡化,我們在樣例中使用的是 Java標準庫中的綫程,而不是協程,具體代碼如下:
  public class MyThread implements Runnable {
  String arg;
  public MyThread(String a) { arg = a; }
  public void run() { // ... }
  public static void main(String[] args) { new Thread(new MyThread(“”test“”)).start(); // ...
  }
  }
  相同功能的代碼,在 Go語言中是這樣的:
  func run(arg string) {
  // ...
  }
  func main() {
  go run(“”test“”)
  ...
  }
  對比非常鮮明。我相信你已經明白為什麼 Go語言會叫 Go語言瞭:Go語言獻給這個時代最好的禮物,就是加瞭 go這個關鍵字。當然也有人會說,叫 Go語言是因為它是 Google齣的。好吧,這也是個不錯的閑聊主題。
  第二個話題是“執行體間的通信”。執行體間的通信包含幾個方式:
  ·執行體之間的互斥與同步
  ·執行體之間的消息傳遞
  先說·執行體之間的互斥與同步·。當執行體之間存在共享資源(一般是共享內存)時,為保證內存訪問邏輯的確定性,需要對訪問該共享資源的相關執行體進行互斥。當多個執行體之間的邏輯存在時序上的依賴時,也往往需要在執行體之間進行同步。互斥與同步是執行體間最基礎的交互方式。
  多數語言在庫層麵提供瞭綫程間的互斥與同步支持,那麼協程之間的互斥與同步呢?呃,不好意思,沒有。事實上多數語言標準庫中連協程都是看不到的。
  再說·執行體之間的消息傳遞·。在並發編程模型的選擇上,有兩個流派,一個是共享內存模型,一個是消息傳遞模型。多數傳統語言選擇瞭前者,少數語言選擇後者,其中選擇·消息傳遞模型·的最典型代錶是 Erlang語言。業界有專門的術語叫“ Erlang風格的並發模型”,其主體思想是兩點:一是“輕量級的進程( Erlang中‘進程’這個術語就是我們上麵說的‘執行體’)”,二是“消息乃進程間通信的唯一方式”。當執行體之間需要相互傳遞消息時,通常需要基於一個消息隊列(message queue)或者進程郵箱( process mail box)這樣的設施進行通信。
  Go語言推薦采用“ Erlang風格的並發模型”的編程範式,盡管傳統的“共享內存模型”仍然被保留,允許適度地使用。在 Go語言中內置瞭消息隊列的支持,隻不過它叫通道( channel)。兩個goroutine之間可以通過通道來進行交互。
  軟件工程
  單機時代的語言可以隻關心問題本身的解決,但是隨著工程規模的不斷擴大,軟件復雜度的不斷增加,軟件工程也成為語言設計層麵要考慮的重要課題。多數軟件需要一個團隊共同去完成,在團隊協作的過程中,人們需要建立統一的交互語言來降低溝通的成本。規範化體現在多個層麵,如:
  ·代碼風格規範
  ·錯誤處理規範
  ·包管理
  ·契約規範(接口)
  ·單元測試規範
  ·功能開發的流程規範
  Go語言很可能是第一個將代碼風格強製統一的語言,例如 Go語言要求 public的變量必須以大寫字母開頭,private變量則以小寫字母開頭,這種做法不僅免除瞭public、private關鍵字,更重要的是統一瞭命名風格。
  另外,Go語言對 { }應該怎麼寫進行瞭強製,比如以下風格是正確的:
  if expression { ... }
  但下麵這個寫法就是錯誤的:
  if expression { ... }
  而C和Java語言中則對花括號的位置沒有任何要求。哪種更有利,這個見仁見智。但很顯然的是,所有的 Go代碼的花括號位置肯定是非常統一的。最有意思的其實還是 Go語言首創的錯誤處理規範:
  f, err := os.Open(filename)
  if err != nil { log.Println(“”Open file failed:““, err) return
  } defer f.Close() ... // 操作已經打開的 f文件
  這裏有兩個關鍵點。其一是 defer關鍵字。 defer語句的含義是不管程序是否齣現異常,均在函數退齣時自動執行相關代碼。在上麵的例子中,正是因為有瞭 defer,纔使得無論後續是否會齣現異常,都可以確保文件被正確關閉。其二是 Go語言的函數允許返迴多個值。大多數函數的最後一個返迴值會為 error類型,以在錯誤情況下返迴詳細信息。 error類型隻是一個係統內置的interface,如下:
  type error interface { Error() string }
  有瞭error類型,程序齣現錯誤的邏輯看起來就相當統一。在Java中,你可能這樣寫代碼來保證資源正確釋放:
  Connection conn = ...;
  try { Statement stmt = ...; try {
  ResultSet rset = ...; try {
  ... // 正常代碼 } finally {
  rset.close();
  } } finally {
  stmt.close();
  } } finally {
  conn.close(); }
  完成同樣的功能,相應的 Go代碼隻需要寫成這樣:
  conn := ... defer conn.Close()
  stmt := ... defer stmt.Close()
  rset := ... defer rset.Close() ... // 正常代碼
  對比兩段代碼, Go語言處理錯誤的優勢顯而易見。當然,其實 Go語言帶給我們的驚喜還有很多,後續有機會我們可以就某個更具體的話題詳細展開來談一談。
  編程哲學
  計算機軟件經曆瞭數十年的發展,形成瞭多種學術流派,有麵嚮過程編程、麵嚮對象編程、函數式編程、麵嚮消息編程等,這些思想究竟孰優孰劣,眾說紛紜。
  C語言是純過程式的,這和它産生的曆史背景有關。 Java語言則是激進的麵嚮對象主義推崇者,典型錶現是它不能容忍體係裏存在孤立的函數。而 Go語言沒有去否認任何一方,而是用批判吸收的眼光,將所有編程思想做瞭一次梳理,融閤眾傢之長,但時刻警惕特性復雜化,極力維持語言特性的簡潔,力求小而精。
  從編程範式的角度來說, Go語言是變革派,而不是改良派。對於C++、Java和C#等語言為代錶的麵嚮對象( OO)思想體係,Go語言總體來說持保守態度,有限吸收。首先,Go語言反對函數和操作符重載( overload),而C++、Java和C#都允許齣現同名函數或操作符,隻要它們的參數列錶不同。雖然重載解決瞭一小部分麵嚮對象編程( OOP)的問題,但
  同樣給這些語言帶來瞭極大的負擔。而 Go語言有著完全不同的設計哲學,既然函數重載帶來瞭負擔,並且這個特性並不對解決任何問題有顯著的價值,那麼 Go就不提供它。其次,Go語言支持類、類成員方法、類的組閤,但反對繼承,反對虛函數( virtual function)和虛函數重載。確切地說, Go也提供瞭繼承,隻不過是采用瞭組閤的文法來提供:
  type Foo struct { Base ...
  }
  func (foo *Foo) Bar() { ... }
  再次,Go語言也放棄瞭構造函數( constructor)和析構函數(destructor)。由於Go語言中沒有虛函數,也就沒有 vptr,支持構造函數和析構函數就沒有太大的價值。本著“如果一個特性並不對解決任何問題有顯著的價值,那麼 Go就不提供它”的原則,構造函數和析構函數就這樣被Go語言的作者們乾掉瞭。
  在放棄瞭大量的 OOP特性後,Go語言送上瞭一份非常棒的禮物:接口( interface)。你可能會說,除瞭 C這麼原始的語言外,還有什麼語言沒有接口呢?是的,多數語言都提供接口,但它們的接口都不同於 Go語言的接口。
  Go語言中的接口與其他語言最大的一點區彆是它的非侵入性。在 C++、Java和C#中,為瞭實現一個接口,你需要從該接口繼承,具體代碼如下:
  class Foo implements IFoo { // Java文法 ... }
  class Foo : public IFoo { // C++文法 ... }
  IFoo* foo = new Foo;
  在Go語言中,實現類的時候無需從接口派生,具體代碼如下:
  type Foo struct { // Go 文法 ... }
  var foo IFoo = new(Foo)
  隻要Foo實現瞭接口IFoo要求的所有方法,就實現瞭該接口,可以進行賦值。 Go語言的非侵入式接口,看似隻是做瞭很小的文法調整,實則影響深遠。其一,Go語言的標準庫再也不需要繪製類庫的繼承樹圖。你隻需要知道這個類實現瞭哪些
  方法,每個方法是啥含義就足夠瞭。其二,不用再糾結接口需要拆得多細纔閤理,比如我們實現瞭 File類,它有下麵這些方法:
  前言:為什麼我們需要一門新語言
  Read(buf []byte) (n int, err error) Write(buf []byte) (n int, err error) Seek(off int64, whence int) (pos int64, err error) Close() error
  那麼,到底是應該定義一個 IFile接口,還是應該定義一係列的 IReader、IWriter、 ISeeker和ICloser接口,然後讓File從它們派生好呢?事實上,脫離瞭實際的用戶場景,討論這兩個設計哪個更好並無意義。問題在於,實現 File類的時候,我怎麼知道外部會如何用它呢?
  其三,不用為瞭實現一個接口而專門導入一個包,而目的僅僅是引用其中的某個接口的定義。在Go語言中,隻要兩個接口擁有相同的方法列錶,那麼它們就是等同的,可以相互賦值,如對於以下兩個接口,第一個接口:
  package one
  type ReadWriter interface {
  Read(buf [] byte) (n int, err error)
  Write(buf [] byte) (n int, err error)
  }
  第二個接口:
  package two
  type IStream interface {
  Write(buf [] byte) (n int, err error)
  Read(buf [] byte) (n int, err error)
  }
  這裏我們定義瞭兩個接口,一個叫 one.ReadWriter,一個叫 two.IStream,兩者都定義瞭Read()和Write()方法,隻是定義的次序相反。 one.ReadWriter先定義瞭 Read()再定義 Write(),而two.IStream反之。
  在Go語言中,這兩個接口實際上並無區彆,因為:
  ·任何實現瞭 one.ReadWriter接口的類,均實現瞭 two.IStream;
  ·任何one.ReadWriter接口對象可賦值給 two.IStream,反之亦然;
  ·在任何地方使用 one.ReadWriter接口,與使用 two.IStream並無差異。所以在Go語言中,為瞭引用另一個包中的接口而導入這個包的做法是不被推薦的。因為多引用一個外部的包,就意味著更多的耦閤。
  除瞭OOP外,近年齣現瞭一些小眾的編程哲學, Go語言對這些思想亦有所吸收。例如, Go語言接受瞭函數式編程的一些想法,支持匿名函數與閉包。再如, Go語言接受瞭以 Erlang語言為代錶的麵嚮消息編程思想,支持 goroutine和通道,並推薦使用消息而不是共享內存來進行並發編程。總體來說, Go語言是一個非常現代化的語言,精小但非常強大。
  小結
  在十餘年的技術生涯中,我接觸過、使用過、喜愛過不同的編程語言,但總體而言, Go語言的齣現是最讓我興奮的事情。我個人對未來 10年編程語言排行榜的趨勢判斷如下:
  □·Java語言的份額繼續下滑,並最終被 C和Go語言超越;
  □·C語言將長居編程榜第二的位置,並有望在 Go取代Java前重獲語言榜第一的寶座;
  □·Go語言最終會取代 Java,居於編程榜之首。
  由七牛雲存儲團隊編著的這本書將盡可能展現齣 Go語言的迷人魅力。希望本書能夠讓更多人理解這門語言,熱愛這門語言,讓這門優秀的語言能夠落到實處,把程序員從以往繁雜的語言細節中解放齣來,集中精力開發更加優秀的係統軟件。
  許式偉 2012年3月7日

《Go語言編程》並非一本泛泛而談的語言教程,它旨在成為您深入理解和高效運用Go語言的得力夥伴。這本書並非一本僅僅羅列語法規則的枯燥手冊,而是通過詳實的項目實踐、精闢的原理剖析以及對Go語言核心特性的深度挖掘,引導讀者逐步構建起紮實的Go語言基礎,並能將其應用於解決實際開發中的復雜問題。 從零開始,穩紮穩打的啓程 對於初次接觸Go語言的讀者,本書提供瞭一條清晰的學習路徑。我們不會直接拋齣晦澀的概念,而是從最基本、最核心的要素入手:變量、數據類型、運算符、控製流程(條件語句、循環語句)等。每一個概念的引入都伴隨著清晰易懂的代碼示例,讓讀者能夠直觀地理解語法如何在實際場景中發揮作用。更重要的是,我們強調“為什麼”——為什麼Go語言設計瞭這樣的語法?它解決瞭傳統語言中的哪些痛點?這種探究式的學習方法,能夠幫助讀者建立起對Go語言設計哲學的第一印象,為後續更深入的學習打下堅實的基礎。 進入到函數、包、接口等稍顯復雜的概念時,我們會循序漸進地進行講解。函數作為代碼復用和模塊化的基石,其定義、參數傳遞、返迴值等都會被細緻闡述。包的概念則引導讀者學習如何組織和管理大型項目,理解Go語言模塊化開發的思想。而接口,作為Go語言中實現多態和解耦的關鍵,我們會用大量篇幅對其進行剖析,通過實際案例展示如何利用接口來編寫更具彈性、更易於擴展的代碼,這對於理解Go語言的並發模型和微服務架構至關重要。 並發編程的精髓,Go語言的核心優勢 Go語言之所以備受青睞,很大程度上歸功於其內置的強大並發支持。本書將並發編程視為重點,投入大量篇幅進行深入講解。我們將從goroutine——Go語言輕量級並發原語——的啓動、調度機製講起,讓你理解其與傳統綫程的本質區彆,以及為何goroutine能夠如此高效地運行。 接著,我們將深入探討channel,這個Go語言特有的通信機製。通過豐富的示例,你將學會如何利用channel進行goroutine之間安全、高效的數據傳遞和同步,避免共享內存帶來的競態條件。本書會涵蓋單嚮channel、帶緩衝channel、nil channel等多種channel的使用場景和技巧,讓你能根據不同需求選擇最閤適的通信方式。 此外,我們還將詳細介紹Go語言在並發安全方麵的其他重要工具,如mutex(互斥鎖)和sync包中的各種同步原語。我們將通過實際案例,對比channel和mutex在不同場景下的優劣,幫助你做齣明智的技術選型。本書還會觸及更高級的並發模式,例如worker pool、fan-in/fan-out等,讓你能夠構建齣能夠高效處理高並發請求的係統。 深入實踐,構建真實世界的應用 理論知識的學習固然重要,但缺乏實踐的知識如同空中樓閣。本書的另一大亮點在於其豐富的項目實踐。我們精選瞭一係列具有代錶性的項目,涵蓋瞭Web開發、網絡編程、數據處理等多個領域。 在Web開發方麵,我們會從搭建一個簡單的HTTP服務器開始,逐步引入Gin、Echo等主流Go Web框架。通過這些框架,你將學習如何處理HTTP請求、路由、中間件、模闆渲染、RESTful API設計等Web開發的核心技能。我們會著重講解如何利用Go語言的並發特性來構建高性能、高並發的Web服務,並會涉及到數據庫操作、緩存集成等內容,讓你能夠獨立開發齣功能完善的Web應用。 在網絡編程領域,本書會帶你探索TCP/UDP協議的底層細節,學習如何使用Go語言的標準庫構建客戶端和服務器端程序。你將瞭解Socket編程、網絡協議的解析與實現,並會通過實際項目,例如一個簡單的聊天室或文件傳輸工具,來鞏固所學知識。 數據處理也是現代軟件開發中不可或缺的一部分。本書將介紹Go語言在處理JSON、XML等常見數據格式方麵的能力,並會涉及數據庫ORM的使用,例如GORM等,幫助你高效地與數據庫進行交互。我們還會探討一些數據處理的優化技巧,讓你能夠編寫齣更具性能的數據處理程序。 不僅僅是語法,更是工程實踐的智慧 《Go語言編程》的目標絕非止步於讓讀者掌握Go語言的語法,我們更希望傳遞的是一種Go語言的工程實踐智慧。本書會深入探討Go語言的錯誤處理機製,讓你理解其獨特的設計哲學,並學會如何優雅地處理和報告錯誤。 在測試方麵,我們會詳細介紹Go語言內置的測試框架,包括單元測試、基準測試等,並講解如何編寫有效的測試用例,確保代碼的質量和健壯性。 代碼的性能優化也是本書關注的重點。我們會講解Go語言的性能剖析工具,以及一些常見的性能瓶頸及其解決方法,幫助你編寫齣運行效率更高的Go程序。 此外,本書還會涉及Go語言的包管理、依賴管理(Go Modules)、代碼風格規範、項目構建與部署等與實際開發緊密相關的知識點,讓你能夠從編寫代碼到最終部署,全程掌握Go語言項目的生命周期。 為讀者量身定製的學習體驗 本書的語言力求簡潔明瞭,避免使用過多的學術術語,力求讓不同背景的讀者都能輕鬆理解。每個章節都設置瞭“小結”和“思考題”,幫助讀者鞏固學習內容,並引導讀者進行更深入的思考。代碼示例都經過精心設計和反復測試,確保其準確性和可運行性。 《Go語言編程》不僅僅是一本書,它是一扇通往Go語言世界的大門,是你成為一名優秀的Go語言開發者的得力助手。無論你是希望為自己的項目注入高性能的血液,還是渴望掌握下一代主流開發語言,亦或是尋求解決復雜並發問題的利器,本書都將是你不可或缺的寶貴資源。它將伴隨你從一名Go語言的初學者,逐步成長為一名能夠獨立承擔復雜項目、解決實際技術難題的Go語言工程師。

用戶評價

評分

評價二 這本《Go語言編程》對於我這種已經有一些編程基礎,但想快速掌握 Go 核心特性的開發者來說,簡直是量身定做的。它並沒有花費過多的篇幅去講解一些顯而易見的編程概念,而是直接切入 Go 語言的精髓,比如 goroutine 和 channel。這部分的內容是我最期待的,也是 Go 語言最吸引人的地方之一。作者對並發模型的講解非常到位,不僅僅是告訴你如何啓動 goroutine,更重要的是教會你如何通過 channel 來安全地在 goroutine 之間傳遞數據,如何避免常見的並發問題,比如死鎖和競態條件。書中的代碼示例也很有代錶性,它們涵蓋瞭常見的並發場景,比如生産者-消費者模型、扇齣(fan-out)和扇入(fan-in)模式等,這些都能幫助我快速理解並應用到實際項目中。此外,書中對錯誤處理的機製也有深入的剖析,Go 語言獨特的 error handling 方式,作者用實際代碼演示瞭如何有效地處理錯誤,以及如何編寫更健壯的代碼。總的來說,如果你想掌握 Go 語言的並發編程能力,以及構建高性能、高可靠性的分布式係統,這本書絕對值得你深入研讀。

評分

評價四 之前在社區裏聽到不少關於 Go 語言在微服務架構中的優勢,所以抱著學習的態度,我入手瞭這本《Go語言編程》。書的前半部分,對於 Go 的基礎語法和常用庫的講解,我感覺稍微有點理論化,雖然嚴謹,但對於追求快速上手的我來說,節奏稍顯緩慢。然而,當深入到後麵關於 Go 在網絡編程和 Web 開發的部分時,這本書的價值就完全顯現齣來瞭。作者詳細講解瞭 Go 的 `net/http` 包,如何使用它來構建 RESTful API,處理 HTTP 請求和響應,以及如何實現服務端的路由和中間件。更讓我驚喜的是,書中還提供瞭一些關於性能優化的建議,以及如何使用 Go 的標準庫來構建高性能的網絡服務。比如,它提到瞭如何利用 `sync.Pool` 來復用對象,減少內存分配的開銷,這些細節對於提升服務性能非常有幫助。此外,書中還介紹瞭一些常用的 Go Web 框架,並且通過實例展示瞭如何使用這些框架來快速開發 Web 應用。總的來說,如果你是想學習如何使用 Go 來構建高性能的網絡服務和 Web 應用,那麼這本書後麵章節的內容絕對會讓你受益匪淺。

評分

評價三 我是在工作需要,需要用 Go 來開發一些後端服務,所以纔開始接觸《Go語言編程》這本書的。之前我對 Go 的瞭解僅限於知道它是一個編譯型語言,並且性能不錯。這本書的內容確實刷新瞭我的認知。它在講解 Go 的麵嚮對象特性時,雖然 Go 並沒有傳統意義上的類和繼承,但作者通過接口(interface)和結構體(struct)的組閤,清晰地展示瞭 Go 的組閤優於繼承的設計哲學,以及如何通過組閤來實現代碼的復用和模塊化。這對於我這種習慣瞭 OOP 的開發者來說,是一個很好的學習過程。讓我印象特彆深刻的是,書中對 Go 模塊化和包管理的部分也有詳細的介紹,講解瞭如何組織項目結構,如何使用 Go Modules 進行依賴管理,這對於開發大型項目至關重要。另外,書中還涉及到瞭 Go 的反射(reflection)機製,雖然反射的使用需要謹慎,但理解它的原理和適用場景,能夠極大地增強代碼的靈活性。總的來說,這本書的內容非常全麵,既有理論深度,又有實踐指導,能夠幫助我快速地將 Go 應用到實際的業務開發中,並且寫齣高質量的代碼。

評分

評價五 作為一名對係統編程和底層原理感興趣的開發者,《Go語言編程》這本書的齣現,讓我眼前一亮。它並沒有止步於應用層的開發,而是對 Go 語言的底層機製進行瞭深入的探討。讓我印象最深刻的是,書中對 Go 垃圾迴收(GC)機製的詳細解讀,作者用圖文並茂的方式解釋瞭 GC 的工作原理,以及如何通過一些調優參數來影響 GC 的行為,這對於理解 Go 應用的內存使用和性能錶現至關重要。此外,書中還涉及到瞭 Go 的內存模型,以及 goroutine 的調度機製,這些底層原理的講解,讓我能夠更深刻地理解 Go 語言的並發模型是如何實現的,以及為什麼 Go 在並發性能上有著如此齣色的錶現。對於一些對 Go 運行時(runtime)感興趣的開發者來說,這本書提供瞭一個絕佳的切入點。它甚至還涉及到瞭 Go 的匯編語言,雖然這部分內容對我來說有些挑戰,但能夠窺見 Go 語言是如何被編譯成機器碼的,也是一種獨特的體驗。總而言之,這本書對於想深入理解 Go 語言底層機製,並且對係統編程有一定興趣的開發者來說,是一本不可多得的參考書。

評分

評價一 我最近一直在尋找一本能夠真正幫助我入門 Go 語言的書,畢竟它在雲原生、微服務等領域如此火熱,感覺不學不行。在網上做瞭不少功課,最終選擇瞭這本《Go語言編程》。坦白說,一開始抱著很大的期望,畢竟書名很直接,內容應該會很紮實。翻開第一頁,就被它清晰的排版和理論與實踐相結閤的風格吸引瞭。作者並沒有一開始就丟齣復雜的概念,而是循序漸進地講解瞭 Go 的基礎語法,比如變量、數據類型、控製流等等,這些都是學習任何一門編程語言的基石。讓我印象深刻的是,書裏不僅僅是羅列語法,而是會通過一些小例子來解釋這些語法在實際開發中是如何應用的。舉個例子,在講到切片(slice)的時候,作者就詳細闡述瞭它的創建、增刪改查操作,並且還對比瞭它與數組的區彆,讓我對切片有瞭更深入的理解,知道什麼時候用切片,什麼時候用數組更閤適。後麵還涉及到函數、指針這些稍微進階的內容,同樣也用瞭很多通俗易懂的比喻來解釋,即使是像我這樣的初學者,也能比較容易地把握住核心概念。總的來說,對於想從零開始學習 Go 語言的朋友,這本書提供瞭一個非常好的起點,它就像一個耐心負責的老師,一步一步地引導你走進 Go 的世界。

評分

大采購,非常不錯。

評分

老公的工具書。所有的書包括工具書,小說,名著之類都在京東買,方便的很,物流也一級棒。希望多齣些優惠活動。

評分

很薄的一本書

評分

很好的書,我看瞭收益特彆不錯

評分

公司有go瞭,從測試一心想轉開發,這次機會來瞭,希望自己堅持學習完。加油

評分

那幸福的閃電告訴我的

評分

Go用起來太舒服瞭,程序員的專業工具,有指針直接能用就覺得很舒服。

評分

經常來買東西,習慣性好評

評分

京東天天成斤買,書看不完啦!!

相關圖書

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 book.tinynews.org All Rights Reserved. 静思书屋 版权所有