人民郵電出版社和實驗樓合作的第 15 本書來了!
go 是一門剛開始嶄露頭角的語言,它是為了讓人們能夠簡單且高效地編寫後端系統(back end system)而建立的。這門語言擁有眾多先進的特性,並且密切關注程式設計師的生產力以及各種與速度相關的事項。和其他語言一樣,go 語言也提供了對 web 程式設計的支援。
本節實驗將列舉一些使用 go 編寫 web 應用的優點,並介紹一些關於 web 應用的基本知識。
知識點go 是一門相對比較年輕的程式語言,它擁有繁榮並且仍在不斷成長的社群,並且它也非常適合用來編寫那些需要快速執行的伺服器端程式。因為 go 語言提供了很多過程式程式語言的特性,所以擁有過程式程式語言使用經驗的程式設計師對 go 應該都不會感到陌生,但與此同時,go 語言也提供了函式式程式設計方面的特性。除了內建對併發程式設計的支援之外,go 語言還擁有現代化的包管理系統、垃圾收集特性以及一系列包羅永珍、威力強大的標準庫。
雖然 go 自帶的標準庫已經非常豐富和巨集大了,但 go 仍然擁有許多質量上乘的開源庫,它們可以對標準庫不足的地方進行補充。
使用 go 語言進行 web 開發正變得日益流行,很多公司都已經開始使用 go 了,其中包括 dropbox、sendgrid 這樣的基礎設施公司,square 和 hailo 這樣的技術驅動的公司,甚至是 bbc、紐約時報這樣的傳統公司。
在開發大規模 web 應用方面,go 語言提供了一種不同於現有語言和平台但又切實可行的方案。大規模可擴充套件的 web 應用通常需要具備以下特質:
大規模的 web 應用應該是可擴充套件的(scalable),這意味著應用的管理者應該能夠簡單、快速地提公升應用的效能以便處理更多請求。如果乙個應用是可擴充套件的,那麼它就是線性的,這意味著應用的管理者可以通過新增更多硬體來獲得更強的請求處理能力。
有兩種方式可以對效能進行擴充套件:
因為 go 語言擁有非常優異的併發程式設計支援,所以它在垂直擴充套件方面擁有不俗的表現:乙個 go web 應用只需要使用乙個作業系統執行緒(os thread),就可以通過排程來高效地執行數十萬個 goroutine。
跟其他 web 應用一樣,go 也可以通過在多個 go web 應用之上架設**來進行高效的水平擴充套件。因為 go web 應用都會被編譯為不包含任何動態依賴關係的靜態二進位制檔案,所以我們可以把這些檔案分發到沒有安裝 go 語言的系統裡,從而以一種簡單且一致的方式部署 go web 應用。
大規模 web 應用應該由可替換的元件構成,這種做法能夠使開發者更容易新增、移除或者修改特性,從而更好地滿足程式不斷變化的需求。除此之外,這種做法的另乙個好處是使開發者可以通過復用模組化的元件來降低軟體開發所需的費用。
儘管 go 是一門靜態型別語言,但使用者可以通過它的介面機制對行為進行描述,以此來實現動態型別匹配(dynamic typing)。go 語言的函式可以接受介面作為引數,這意味著使用者只要實現了介面所需的方法,就可以在繼續使用現有**的同時向系統中引入新的**。與此同時,因為 go 語言的所有型別都實現了空介面,所以使用者只需要建立出乙個接受空介面作為引數的函式,就可以把任何型別的值用作該函式的實際引數。此外,go 語言還實現了一些在函式式程式設計中非常常見的特性,其中包括函式型別、使用函式作為值以及閉包,這些特性允許使用者使用已有的函式來構建新的函式,從而幫助使用者構建出更為模組化的**。
go 語言也經常會被用於建立微服務(microservice)。在微服務架構中,大型應用通常由多個規模較小的獨立服務組合而成,這些獨立服務通常可以相互替換,並根據它們各自的功能進行組織。比如,日誌記錄服務會被歸類為系統級服務,而開具賬單、風險分析這樣的服務則會被歸類為應用級服務。建立多個規模較小的 go 服務並將它們組合為單個 web 應用,這種做法使得我們可以在有需要的時候對應用中的服務進行替換,而整個 web 應用也會因此變得更加模組化。
和其他龐大而複雜的應用一樣,擁有乙個易於維護的**庫(codebase)對大規模的 web 應用來說也是非常重要的。這是因為大規模的應用通常都會不斷地成長和演化,所以開發者需要經常性地回顧並修改**,而修改難懂、笨拙的**需要花費大量的時間,並且隱含著可能會造成某些功能無法正常運作的風險。因此,確保源**能夠以適當的方式組織起來並且具有良好的可維護性對開發者來說就顯得至關重要了。
go 語言的設計鼓勵良好的軟體工程實踐,它擁有簡潔且極具可讀性的語法以及靈活且清晰的包管理系統。除此之外,go 語言還有一整套優秀的工具,它們不僅可以增強程式設計師的開發體驗,還能夠幫助他們寫出更具可讀性的**,比如以標準化方式對 go **進行格式化的源**格式化程式 gofmt 就是其中乙個例子。
因為 go 語言希望文件可以和**一同演進,所以它的文件工具 godoc 會對 go 源**及其注釋進行語法分析,然後以 html、純文字或者其他多種格式建立出相應的文件。godoc 的使用方法非常簡單,開發者只需要把文件寫到源**裡面,godoc 就會把這些文件以及與之相關聯的**提取出來,生成相應的文件檔案。
除此之外,go 還內建了對測試的支援:gotest 工具會自動尋找與源**處於同乙個包(package)之內的測試**,並執行其中的功能測試和效能測試。go 語言也提供了 web 應用測試工具,這些工具可以模擬出乙個 web 伺服器,並對該伺服器生成的響應(response)進行記錄。
高效能不僅意味著能夠在短時間內處理大量請求,還意味著伺服器能夠快速地對客戶端進行響應,並讓終端使用者(end user)能夠快速地執行操作。
go 語言的乙個設計目標就是提供接近於 c 語言的效能,儘管這個目標目前尚未達成,但 go 語言現在的效能已經非常具有競爭力:go 程式會被編譯為本地碼(native code),這一般意味著 go 程式可以執行得比解釋型語言的程式要快,並且就像前面說過的那樣,go 語言的 goroutine 對併發程式設計提供了非常好的支援,這使得 go 應用可以同時處理多個請求。
希望以上介紹能夠引起你對使用 go 語言及其平台進行 web 開發的興趣。但是在學習如何使用 go 進行 web 開發之前,我們需要先來了解一下什麼是 web 應用,以及它們的工作原理是什麼,這會給我們學習之後的內容帶來非常大的幫助。
以上內容來自《web 程式設計》第一章,點選鏈結即可免費試學前兩章!
go語言web開發框架 gin
gin是乙個golang的微框架,具有快速靈活,容錯方便等特點。go語言本身的net http就已經很簡單強大,框架更像是一些常用函式或者工具的集合。借助框架開發,不僅可以省去很多常用的封裝帶來的時間,也有助於團隊的編碼風格和形成規範。首先安裝gin go get gopkg.in gin goni...
用go語言開發簡易量化框架(三) WEB系統搭建
本文主要說明web系統搭建,主要的元件 介面,以及啟動流程。啟動流程,比較簡單,如下圖 配置檔案,底層使用viper,go語言中使用較多的乙個配置檔案庫,支援toml,yaml,json,ini格式。上層根據習慣用法,封裝到了包cfg中,提供mustget和get方法,mustget 方法,如果沒有...
go語言web開發 排坑指南
本文章持續更新中.1 引數解析 func login w http.responsewriter,r http.request r.parseform 這個方法用來解析引數,不使用這個方法,r.form中不會包含相應的引數 2 build build 時要寫好路徑,例如 你要build webtes...