部署簡單。Go 編譯生成的是一個靜態(tài)可執(zhí)行文件,除了 glibc 外沒有其他外部依賴。這讓部署變得異常方便:目標機器上只需要一個基礎的系統(tǒng)和必要的管理、監(jiān)控工具,完全不需要操心應用所需的各種包、庫的依賴關(guān)系,大大減輕了維護的負擔。這和 Python 有著巨大的區(qū)別。由于歷史的原因,Python 的部署工具生態(tài)相當混亂【比如 setuptools, distutils, pip, buildout 的不同適用場合以及兼容性問題】。官方 PyPI 源又經(jīng)常出問題,需要搭建私有鏡像,而維護這個鏡像又要花費不少時間和精力。
10多年專注成都網(wǎng)站制作,企業(yè)網(wǎng)站設計,個人網(wǎng)站制作服務,為大家分享網(wǎng)站制作知識、方案,網(wǎng)站設計流程、步驟,成功服務上千家企業(yè)。為您提供網(wǎng)站建設,網(wǎng)站制作,網(wǎng)頁設計及定制高端網(wǎng)站建設服務,專注于企業(yè)網(wǎng)站設計,高端網(wǎng)頁制作,對隧道混凝土攪拌車等多個行業(yè),擁有多年的網(wǎng)站推廣經(jīng)驗。
并發(fā)性好。Goroutine 和 channel 使得編寫高并發(fā)的服務端軟件變得相當容易,很多情況下完全不需要考慮鎖機制以及由此帶來的各種問題。單個 Go 應用也能有效的利用多個 CPU 核,并行執(zhí)行的性能好。這和 Python 也是天壤之比。多線程和多進程的服務端程序編寫起來并不簡單,而且由于全局鎖 GIL 的原因,多線程的 Python 程序并不能有效利用多核,只能用多進程的方式部署;如果用標準庫里的 multiprocessing 包又會對監(jiān)控和管理造成不少的挑戰(zhàn)【我們用的 supervisor 管理進程,對 fork 支持不好】。部署 Python 應用的時候通常是每個 CPU 核部署一個應用,這會造成不少資源的浪費,比如假設某個 Python 應用啟動后需要占用 100MB 內(nèi)存,而服務器有 32 個 CPU 核,那么留一個核給系統(tǒng)、運行 31 個應用副本就要浪費 3GB 的內(nèi)存資源。
良好的語言設計。從學術(shù)的角度講 Go 語言其實非常平庸,不支持許多高級的語言特性;但從工程的角度講,Go 的設計是非常優(yōu)秀的:規(guī)范足夠簡單靈活,有其他語言基礎的程序員都能迅速上手。更重要的是 Go 自帶完善的工具鏈,大大提高了團隊協(xié)作的一致性。比如 gofmt 自動排版 Go 代碼,很大程度上杜絕了不同人寫的代碼排版風格不一致的問題。把編輯器配置成在編輯存檔的時候自動運行 gofmt,這樣在編寫代碼的時候可以隨意擺放位置,存檔的時候自動變成正確排版的代碼。此外還有 gofix, govet 等非常有用的工具。
執(zhí)行性能好。雖然不如 C 和 Java,但通常比原生 Python 應用還是高一個數(shù)量級的,適合編寫一些瓶頸業(yè)務。內(nèi)存占用也非常省。
以我就說只會 JavaScript 啊 Java EE 啊 PHP 的就不要冒充程序員了……
先看看 Go 的 net 包和 net/http 包?;?net 包里相對低級的接口,用 TCP 寫基本的 C/S 通信程序。如果需要權(quán)威參考書,Unix Network Programming 是唯一正確的選擇。另有 Beej‘s Guide to Network Programming 方便入門。
之后去看 rfc1945 實現(xiàn)基本的 HTTP/1.0。再之后開始實現(xiàn) HTTP/1.1 的各種細節(jié)的時候才需要 http 權(quán)威指南吧。
適合??蚣茏銐虺墒炝?A Survey of 5 Go Web Frameworks
小型項目你甚至不用框架,用net/http http - The Go Programming Language
常用庫也成熟了 Top - Go Search
golang的web后端即使不concurrent也比php,ruby,python快很多很多
golang里用concurrent真的非常方便,非常非???,超大web項目golang scale成本低
如果你想,golang的部署可以比php更方便,使用go get和http.ServeAndListen()可以不用nginx和apache
對于文件改動重新編譯其實并不是大問題,看pilu/fresh · GitHub,其實你自己寫shell腳本(也可以直接用go寫,因為它本身就是系統(tǒng)語言)監(jiān)控文件系統(tǒng)改動然后自動重新build,即使是C/C++的項目這也不是大問題,人們不用C/C++寫web是因為它們不是寫web app的最佳選擇
golang寫的代碼編譯通過后,要比scripting language魯棒,因為go compiler強制一些最佳實踐
前端框架越來越豐富,前后端分離已經(jīng)是大多數(shù)軟件團隊采取的模式了。vue使用的場景也越來越多。
go本來使用template模板來進行前端的表現(xiàn),現(xiàn)在可以用vue來分擔很大一部分工作了。
通常直接使用go語言寫后端,然后使用靜態(tài)模板加載渲染前端,前端獲取后端提供的數(shù)據(jù)是使用{{ }}符號,2個套在一起的花括號。這個也是vue使用的數(shù)據(jù)表現(xiàn)方式。
如果go+vue來協(xié)同工作的話,需要對vue進行一點設置。比如把{{ }}的方式改為[[ ]]的方式。
首先我們要知道,vue的使用,需要在頁面中加載vue.js或vue.min.js
純靜態(tài)網(wǎng)頁使用vue是這樣的(給個html例子)
然后我們實現(xiàn)一個go的簡單web服務和模板頁面
這個go服務器通過端口 1989 展示服務器頁面,提供了一個靜態(tài)文件路徑 htmlpage,我們把vue.js和index.html文件都放置在htmlpage路徑里。
go服務器還用模板給前臺頁面提供了一個News結(jié)構(gòu)的數(shù)據(jù),數(shù)據(jù)包括:Title,Content,Author的值。
在index.html頁面中,加載vue.js的時候需要帶上靜態(tài)路徑 htmlpage
在 new 一個 vue 變量的時候,必須有一句來設置包裹數(shù)據(jù)的符號,我們這里設置這個符號為[[ ]]
同時,所有需要由 vue 渲染的數(shù)據(jù),都寫成類似這樣的樣子
在 go + vue 方式下的完整模板文件 index.html
此頁面中{{ }}包裹的數(shù)據(jù)是由go從后端提供的數(shù)據(jù)( 例如:{{.Title}}),而[[ ]]包裹的數(shù)據(jù),是vue渲染的數(shù)據(jù)。
只是把 Vue里的數(shù)據(jù),改為由go后端提供即可。
好吧,作者已經(jīng)在向月亮示愛了。呵呵 _
運行一下程序,看修改模板后的效果。