適合??蚣茏銐虺墒炝?A Survey of 5 Go Web Frameworks
創(chuàng)新互聯(lián)建站是一家專業(yè)提供郁南企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、成都網(wǎng)站制作、html5、小程序制作等業(yè)務(wù)。10年已為郁南眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
小型項(xiàng)目你甚至不用框架,用net/http http - The Go Programming Language
常用庫(kù)也成熟了 Top - Go Search
golang的web后端即使不concurrent也比php,ruby,python快很多很多
golang里用concurrent真的非常方便,非常非???,超大web項(xiàng)目golang scale成本低
如果你想,golang的部署可以比php更方便,使用go get和http.ServeAndListen()可以不用nginx和apache
對(duì)于文件改動(dòng)重新編譯其實(shí)并不是大問(wèn)題,看pilu/fresh · GitHub,其實(shí)你自己寫(xiě)shell腳本(也可以直接用go寫(xiě),因?yàn)樗旧砭褪窍到y(tǒng)語(yǔ)言)監(jiān)控文件系統(tǒng)改動(dòng)然后自動(dòng)重新build,即使是C/C++的項(xiàng)目這也不是大問(wèn)題,人們不用C/C++寫(xiě)web是因?yàn)樗鼈儾皇菍?xiě)web app的最佳選擇
golang寫(xiě)的代碼編譯通過(guò)后,要比scripting language魯棒,因?yàn)間o compiler強(qiáng)制一些最佳實(shí)踐
寫(xiě)了2次才寫(xiě)完,內(nèi)容很長(zhǎng),翻譯了很久,內(nèi)容來(lái)源于Cobra github介紹。翻譯完也更全面的了解了Cobra,功能相當(dāng)強(qiáng)大完善,各種使用的場(chǎng)景都考慮到了。另外也擴(kuò)展了一些其它知識(shí),比如 命令行玩法 , Levenshtein distance 等等。以下是正文:
Cobra提供簡(jiǎn)單的接口來(lái)創(chuàng)建強(qiáng)大的現(xiàn)代化CLI接口,比如git與go工具。Cobra同時(shí)也是一個(gè)程序, 用于創(chuàng)建CLI程序
Cobra是建立在結(jié)構(gòu)的命令、參數(shù)和標(biāo)志之上。
命令代表操作,參數(shù)和標(biāo)志是這些行動(dòng)的修飾符。
最好的應(yīng)用程序就像讀取句子。用戶會(huì)知道如何使用本機(jī)應(yīng)用程序,因?yàn)樗麄儗⒗斫馊绾问褂盟?/p>
比如下面的例子, server 是命令, port 是標(biāo)志:
在下面的命令,我們告訴Git克隆url地址bare
使用Cobra很簡(jiǎn)單。首先,使用 go get 安裝最新版本
然后在你項(xiàng)目里引用Cobra
通?;贑obra的應(yīng)用程序?qū)⒆裱旅娴慕M織結(jié)構(gòu),當(dāng)然你也可以遵循自己的接口:
在Cobra應(yīng)用程序中,通常main.go文件非??斩?。它主要只干一件事:初始化Cobra。
Cobra提供自己的程序來(lái)創(chuàng)建你的程序并且添加你想要的命令。這是最簡(jiǎn)單的方式把Cobra添加到你的程序里。
這里 你能找到相關(guān)信息
使用Cobra,需要?jiǎng)?chuàng)建一個(gè)空的main.go文件和一個(gè)rootCmd文件。你可以選擇在合適的地方添加額外的命令。
Cobra不需要特殊的構(gòu)造函數(shù)。簡(jiǎn)單的就可以創(chuàng)建你的命令。
理想情況下你把這個(gè)放在在 app/cmd/root.go
你會(huì)另外定義標(biāo)志和處理配置init()函數(shù)。
比如 cmd/root.go
你需要在main函數(shù)里執(zhí)行root命令。
通常main.go文件非??斩?。它主要只干一件事:初始化Cobra。
其它的命令通常定義在cmd/目錄下的自己文件內(nèi)
如果你想創(chuàng)建一個(gè)version命令,你可以創(chuàng)建cmd/version.go文件,并在文件里這么寫(xiě):
標(biāo)志提供修飾符控制動(dòng)作命令如何操作
當(dāng)標(biāo)志定義好了,我們需要定義一個(gè)變量來(lái)關(guān)聯(lián)標(biāo)志
'持久'表示每個(gè)在那個(gè)命令下的命令都將能分配到這個(gè)標(biāo)志。對(duì)于全局標(biāo)志,'持久'的標(biāo)志綁定在root上。
Cobra默認(rèn)只在目標(biāo)命令上解析標(biāo)志,父命令忽略任何局部標(biāo)志。通過(guò)打開(kāi) Command.TraverseChildren Cobra將會(huì)在執(zhí)行任意目標(biāo)命令前解析標(biāo)志
你同樣可以通過(guò) viper 綁定標(biāo)志:
在這個(gè)例子中,永久的標(biāo)記 author 被 viper 綁定, 注意 , 當(dāng)用戶沒(méi)有給 --author 提供值, author 不會(huì)被賦值。
標(biāo)記默認(rèn)是可選的,如果你希望當(dāng)一個(gè)標(biāo)記沒(méi)有設(shè)置時(shí),命令行報(bào)錯(cuò),你可以標(biāo)記它為必須的
驗(yàn)證位置參數(shù)可以通過(guò) Command 的 Args 字段。
內(nèi)置下列驗(yàn)證方法
一個(gè)設(shè)置自定義驗(yàn)證的例子
在下面的例子,我們定義了3個(gè)命令。2個(gè)在頂級(jí),一個(gè)(cmdTimes)是其中一個(gè)頂級(jí)命令的子命令。在這個(gè)例子里,由于沒(méi)有給 rootCmd 提供 Run ,單獨(dú)的root是不能運(yùn)行的,必須要有子命令。
我們僅為一個(gè)命令定義了標(biāo)記。
更多關(guān)于flags的文檔可以在 找到
更完整大型程序的例子, 可以查看 Hugo .
當(dāng)你的程序有子命令時(shí),Cobra 會(huì)自動(dòng)給你程序添加help命令。當(dāng)你運(yùn)行‘a(chǎn)pp help’,會(huì)調(diào)用help命令。另外,help同樣支持其它輸入命令。例如,你有一個(gè)沒(méi)有任何其它配置的命令叫‘create’,當(dāng)你調(diào)用‘a(chǎn)pp help create’ Corbra 將會(huì)起作用。
下面的輸入是 Cobra 自動(dòng)生成的。除了命令和標(biāo)志的定義,其它不再需要。
help 就跟其它命令一樣,并沒(méi)有特殊的邏輯或行為。事實(shí)上,你也可以提供你自己help如果你想的話。
你能為默認(rèn)的命令,提供你自己的help命令或模板。使用下面的方法:
后2個(gè)也將適用于任何子命令
當(dāng)用戶提供無(wú)效的標(biāo)記或命令,Cobra 將會(huì)返回 用法 。
你可能從上面的幫助意識(shí)到,默認(rèn)的幫助將被嵌入到用法里然后作為輸出。
你能提供你自己的用法函數(shù)或模板給 Cobra 使用。
比如幫助,方法和模板都可以重寫(xiě)。
如果Version字段設(shè)置到了根命令,Cobra 會(huì)提供了一個(gè)頂層 ‘--version’標(biāo)記。運(yùn)行帶上‘--version’標(biāo)記的程序,將會(huì)按照模板版本信息。模板可以通過(guò) cmd.SetVersionTemplate(s string) 方法修改
在命令運(yùn)行前或運(yùn)行后,再運(yùn)行方法非常容易。 PersistentPreRun 和 PreRun 方法將會(huì)在 Run 之前執(zhí)行。 PersistentPostRun 和 PostRun 方法將會(huì)在 Run 之后執(zhí)行。 Persistent*Run 方法會(huì)被子命令繼承,如果它們自己沒(méi)有定義的話。這些方法將按照下面的屬性執(zhí)行:
下面的例子,2個(gè)命令都使用了上面的特性。當(dāng)子命令執(zhí)行的時(shí)候,它將執(zhí)行根命令的 PersistentPreRun ,但不會(huì)執(zhí)行根命令的 PersistentPostRun :
輸出:
Cobra 會(huì)自動(dòng)輸出建議,當(dāng)遇到“unknown command”錯(cuò)誤時(shí)。這使得當(dāng)輸入錯(cuò)誤時(shí), Cobra 的行為類似 git 命令。例如:
建議會(huì)基于注冊(cè)的子命令自動(dòng)生成。使用了 Levenshtein distance 的實(shí)現(xiàn)。每一個(gè)注冊(cè)的命令會(huì)匹配2個(gè)距離(忽略大小寫(xiě))來(lái)提供建議。
如果你希望在你的命令里,禁用建議或虛弱字符串的距離,使用:
或
你可以通過(guò) SuggestFor 來(lái)給命令提供明確的名詞建議。這個(gè)特性允許當(dāng)字符串不相近,但是意思與你的命令相近,別切你也不想給該命令設(shè)置別名。比如:
Cobra 可以基于子命令,標(biāo)記,等生成文檔。以以下格式:
Cobra 可以生成一個(gè)bash-completion文件。如果你給命令添加更多信息,這些completions可以非常強(qiáng)大和靈活。更多介紹在 Bash Completions 。
1、下載go的zip文件。并且一定要把文件解壓到c:\go目錄下。
2、配置windows的高級(jí)環(huán)境變量。包括:GOROOT、GOOS、GOBIN、GOARCH。并且在path變量里面把c:\go\bin加入。以便可以在命令行直接運(yùn)行g(shù)o命令。
舉例:我的機(jī)器:
GOPATH= c:\go;c:\go\src;F:\workspace\goSample01;
GOBIN=c:\go\bin;F:\workspace\goSample01\bin;
其中,c:\go是go的安裝路徑;
F:\workspace\goSample01是我寫(xiě)的go語(yǔ)言項(xiàng)目的工程目錄;
F:\workspace\goSample01\bin是go語(yǔ)言項(xiàng)目的工程目錄下的可執(zhí)行文件路徑;
3、在完成環(huán)境變量配置后,打開(kāi)一個(gè)命令行窗口,直接輸入go,然后回車,看看是否出現(xiàn)go的幫助信息。如果出現(xiàn),那么go的基本環(huán)境就OK了。
注意:這個(gè)基本環(huán)境不包含開(kāi)發(fā)工具,也不能直接編譯帶C代碼的go程序。
4、(可選)為了支持Import遠(yuǎn)程包,最好裝個(gè)gomingw。下載地址:。如果下的是壓縮包,請(qǐng)把它解壓到C盤。例如,C:\gowin-env。里面有個(gè)Console.bat是以后使用go get的環(huán)境。舉例:有個(gè)文件a.go,里面import(
"fmt"
"github.com/astaxie/beedb"
_ "github.com/ziutek/mymysql/godrv"
為了編譯該a.go文件,需要啟動(dòng)Console.bat,然后在該命令行窗口,進(jìn)入c:\go\src目錄下,執(zhí)行g(shù)o getgithub.com/astaxie/beedb
Go get github.com/ziutek/mymysql/godrv .
Go會(huì)自動(dòng)下載該遠(yuǎn)程包并編譯和安裝這些包。
配置goclipse(可選)
(如果不喜歡eclipse開(kāi)發(fā)工具,請(qǐng)?zhí)^(guò)這個(gè)配置。)
1、下載并安裝goclipse插件。Goclipse是go語(yǔ)言for eclipse的插件,下載地址:
2、啟動(dòng)eclipse并創(chuàng)建go項(xiàng)目。然后寫(xiě)個(gè)最簡(jiǎn)單的helloworld.go文件,并運(yùn)行。代碼如下:
packagemainimport"fmt"func main(){ fmt.Printf("hello, world")}
配置gocode(可選)
如果不需要go語(yǔ)法輔助和eclipse里面的(按ALT+/)彈出go語(yǔ)言自動(dòng)輔助功能,請(qǐng)?zhí)^(guò)這個(gè)配置。
1、下載gocode的zip文件,解壓后放在go的bin目錄下。
2、下載并安裝Git軟件。并且在path里面配置git的執(zhí)行路徑。例如c:\git\bin
3、在命令行執(zhí)行:go build .\gocode。如果一切正常,那么將會(huì)編譯生成一個(gè)gocode.exe文件在go的bin目錄下。如果編譯失敗,那么就轉(zhuǎn)第4步。
4、如果第3步直接編譯gocode源文件成功,那就直接到第5步。否則,就需要通過(guò)git下載gocode源文件,然后再編譯。在命令行執(zhí)行:go get -u github.com/nsf/gocode 。就會(huì)生成gocode.exe文件。
5、在goclipse插件里面指定gocode的路徑。就可以在elcipse里面調(diào)用gocode來(lái)幫助寫(xiě)編碼了。
從開(kāi)發(fā)工具這塊看,go語(yǔ)言還不夠成熟,開(kāi)發(fā)工具都還不完善,有待改進(jìn)。
下載go-tour教程源代碼(可選)
Google有個(gè)在線運(yùn)行g(shù)o語(yǔ)言的教程(),很不錯(cuò)。支持在web上直接運(yùn)行大部分的go程序,想了解這個(gè)教程的源代碼的朋友可以通過(guò)以下方式獲取。如果沒(méi)興趣,可以跳過(guò)這個(gè)步驟。
1、下載安裝Mercurial軟件。
2、在命令行下輸入:
hg clone
這個(gè)URL是我從google的go-tour源代碼的一個(gè)clone。作為測(cè)試用的。如果把http改成https協(xié)議,下載就會(huì)失敗。搞不懂。
編譯帶調(diào)用C代碼的go文件(可選)
1、為了在windows下編譯帶C代碼的go程序,你首先需要下載并安裝MinGW或者Cygwin。
2、首選安裝MinGW。在安裝MinGW之后,記得要把MinGW安裝目錄\bin路徑設(shè)置在path環(huán)境變量里面,以便能在dos窗口下直接調(diào)用gcc。
3、下載一個(gè)gowin-env。下載地址:gowin-env。下載后解壓到某個(gè)目錄下,例如:C:\gowin-env. 然后,編輯go-env.bat。配置相關(guān)的go參數(shù)。例如,我的配置是:
set GOARCH=386
set GOOS=windows
set GOROOT=c:\go
set GOBIN=%GOROOT%\bin
set GOPATH=%GOROOT%;F:\workspace\goSample01;
設(shè)置好go-env.bat后,就可以點(diǎn)擊Console.bat來(lái)啟動(dòng)編譯和運(yùn)行窗口。
4、編寫(xiě)一個(gè)帶C代碼的go程序。例如,testc.go
5、編譯
例如:
go build -compiler gccgo test_c.go
運(yùn)行調(diào)用C代碼的go文件(可選)
1、testc.go.
創(chuàng)建rand目錄,然后在rand里面創(chuàng)建testc.go. 代碼如下:
package rand
/*
//
#include stdio.h
*/
import "C"
func PrintHello() {
C.puts(C.CString("Hello, world\n"))
}
2、a.go
在rand下創(chuàng)建a.go.代碼如下:
package rand
import "fmt"
func SayHello(name string){
fmt.Println(name)
}
3、test_import.go
在rand的上一級(jí)創(chuàng)建test_import.go。代碼如下:
package main
import "./rand"
func main(){
rand.SayHello("tom")
rand.PrintHello()
}
4、運(yùn)行test_import.go
go run test_import.go
在測(cè)試其它幾個(gè)C代碼的時(shí)候,發(fā)現(xiàn)windows版本的cgo還有些編譯問(wèn)題,同樣的代碼轉(zhuǎn)移到蘋(píng)果的XCODE下就沒(méi)有問(wèn)題。后來(lái)終于發(fā)現(xiàn)原因了,原來(lái)有些例子是unix平臺(tái)下的,而在windows平臺(tái)下,方法名和參數(shù)需要做調(diào)整。
例如:下面代碼在windows下編譯報(bào)一堆錯(cuò)誤。
package rand
/*
#include stdlib.h
*/
import "C"
func Random() int {
return int(C.random())
}
func Seed(i int) {
C.srandom(C.uint(i))
}
這里需要把return int(C.random()) 修改為“return int(C.rand())”
C.srandom(C.uint(i))修改為“C.srand(C.uint(i))”編譯就OK了。
Go語(yǔ)言將支持Android
概述
我們建議將Go語(yǔ)言引入Android平臺(tái),重點(diǎn)是用Go語(yǔ)言編寫(xiě)游戲程序,API將在Android NDK中定義。
背景
Android平臺(tái)被設(shè)定為一個(gè)多應(yīng)用操作系統(tǒng),一個(gè)相對(duì)于傳統(tǒng)UNIX系統(tǒng)來(lái)說(shuō)更依賴于網(wǎng)絡(luò)庫(kù)和服務(wù)的操作系統(tǒng),這意味著我們將為Go運(yùn)行時(shí)開(kāi)放更多的API。
將Golang帶入Android平臺(tái)是一件非常糟糕的事情,因?yàn)锳ndroid本身是Java構(gòu)建的并且擁有巨量的API,任何試圖將這些API用Go替代的結(jié)果將會(huì)導(dǎo)致一個(gè)非常糟糕的結(jié)果。無(wú)論是手工建立包裝類還是自動(dòng)建立都會(huì)導(dǎo)致程序運(yùn)行非常緩慢。
然而如果使用基于C的API,通過(guò)AndroidNDK來(lái)編寫(xiě)一些游戲類程序可能會(huì)帶來(lái)意想不到的收獲。
提議
在Golang 1.4周期中,Android平臺(tái)的編譯將納入Go的源,并且包含Android支持的cgo(由Elias Naur貢獻(xiàn))。Dalvik-loadable .so外部連接文件的支持也會(huì)由Android NDK提供。
在發(fā)布上我們?nèi)匀惶峁┙徊嫫脚_(tái)編譯,并且支持在Linux主機(jī)上adb工具在Android設(shè)備上測(cè)試程序。
我們將會(huì)提供一個(gè)名叫g(shù)o.mobile的子版本,包含:
1、通過(guò)Android NDK對(duì)OpenGL,OpenSL和OpenMAX的支持。
2、一個(gè)Java-Go的工具,支持通過(guò)Java調(diào)用Go的Package,所以許多游戲的菜單UI可以通過(guò)標(biāo)準(zhǔn)SDK構(gòu)建。(有可能會(huì)支持通過(guò)其他語(yǔ)言調(diào)用Go,比如Objective-C。)
3、集成AndroidStudio
新特性將會(huì)在Go1.4穩(wěn)定版中提供。
可以學(xué)習(xí)黑馬程序員的這個(gè)教程
20小時(shí)快速入門go語(yǔ)言:網(wǎng)頁(yè)鏈接
go語(yǔ)言的優(yōu)勢(shì)
可直接編譯成機(jī)器碼,不依賴其他庫(kù),glibc的版本有一定要求,部署就是扔一個(gè)文件上去就完成了。
靜態(tài)類型語(yǔ)言,但是有動(dòng)態(tài)語(yǔ)言的感覺(jué),靜態(tài)類型的語(yǔ)言就是可以在編譯的時(shí)候檢查出來(lái)隱藏的大多數(shù)問(wèn)題,動(dòng)態(tài)語(yǔ)言的感覺(jué)就是有很多的包可以使用,寫(xiě)起來(lái)的效率很高。
語(yǔ)言層面支持并發(fā),這個(gè)就是Go最大的特色,天生的支持并發(fā)。Go就是基因里面支持的并發(fā),可以充分的利用多核,很容易的使用并發(fā)。
內(nèi)置runtime,支持垃圾回收,這屬于動(dòng)態(tài)語(yǔ)言的特性之一吧,雖然目前來(lái)說(shuō)GC(內(nèi)存垃圾回收機(jī)制)不算完美,但是足以應(yīng)付我們所能遇到的大多數(shù)情況,特別是Go1.1之后的GC。
簡(jiǎn)單易學(xué),Go語(yǔ)言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go關(guān)鍵字是25個(gè),但是表達(dá)能力很強(qiáng)大,幾乎支持大多數(shù)你在其他語(yǔ)言見(jiàn)過(guò)的特性:繼承、重載、對(duì)象等。
豐富的標(biāo)準(zhǔn)庫(kù),Go目前已經(jīng)內(nèi)置了大量的庫(kù),特別是網(wǎng)絡(luò)庫(kù)非常強(qiáng)大。
內(nèi)置強(qiáng)大的工具,Go語(yǔ)言里面內(nèi)置了很多工具鏈,最好的應(yīng)該是gofmt工具,自動(dòng)化格式化代碼,能夠讓團(tuán)隊(duì)review變得如此的簡(jiǎn)單,代碼格式一模一樣,想不一樣都很困難。
跨平臺(tái)編譯,如果你寫(xiě)的Go代碼不包含cgo,那么就可以做到window系統(tǒng)編譯linux的應(yīng)用,如何做到的呢?Go引用了plan9的代碼,這就是不依賴系統(tǒng)的信息。
內(nèi)嵌C支持,Go里面也可以直接包含C代碼,利用現(xiàn)有的豐富的C庫(kù)。