在命令行或終端輸入go即可查看所有支持的命令
創(chuàng)新互聯(lián)成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元龍安做網(wǎng)站,已為上家服務(wù),為龍安各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
go get:獲取遠(yuǎn)程包(需提前安裝git)
go run:直接運(yùn)行程序
go build:測(cè)試編譯,檢查是否有編譯錯(cuò)誤
go fmt:格式化源碼(部分IDE在保存時(shí)自動(dòng)調(diào)用)
go install:編譯包文件并編譯整個(gè)程序
go test:運(yùn)行測(cè)試文件
go doc:查看文檔(CHM手冊(cè))
cobra是一個(gè)提供簡(jiǎn)單接口來創(chuàng)建強(qiáng)大的現(xiàn)代CLI界面的庫類似git git tools,cobra也是一個(gè)應(yīng)用程序,它會(huì)生成你的應(yīng)用程序的腳手架來快速開發(fā)基于cobra的應(yīng)用程序
cobra提供:
cobra建立在命令、參數(shù)、標(biāo)志的結(jié)構(gòu)之上
commands代表動(dòng)作,args是事物,flags是動(dòng)作的修飾符
最好的應(yīng)用程序在使用時(shí)讀起來就像句子,因此,用戶直觀地知道如何與它們交互
模式如下:APPNAME VERB NOUN --ADJECTIVE. or APPNAME COMMAND ARG --FLAG(APPNAME 動(dòng)詞 名詞 形容詞 或者 APPNAME 命令 參數(shù) 標(biāo)志)
一些真實(shí)世界的好例子可以更好地說明這一點(diǎn)
kubectl 命令更能體現(xiàn)APPNAME 動(dòng)詞 名詞 形容詞
如下的例子,server 是command,port是flag
這個(gè)命令中,我們告訴git 克隆url
命令是應(yīng)用程序的中心點(diǎn),應(yīng)用程序支持的每一個(gè)交互都包含在一個(gè)命令中,命令可以有子命令,也可以運(yùn)行操作
在上面的例子中,server是命令
更多關(guān)于cobra.Command
flag是一種修改命令行為的方式,cobra支持完全兼容POSIX標(biāo)志,也支持go flag package,cobra可以定義到子命令上的標(biāo)志,也可以僅對(duì)該命令可用的標(biāo)志
在上面的命令中,port是標(biāo)志
標(biāo)志的功能由 pflag library 提供,pflag library是flag標(biāo)準(zhǔn)庫的一個(gè)分支,在添加POSIX兼容性的同時(shí)維護(hù)相同的接口。
使用cobra很簡(jiǎn)單,首先,使用go get按照最新版本的庫,這個(gè)命令會(huì)安裝cobra可執(zhí)行程序以及庫和依賴項(xiàng)
下一步,引入cobra到應(yīng)用程序中
雖然歡迎您提供自己的組織,但通?;贑obra的應(yīng)用程序?qū)⒆裱韵陆M織結(jié)構(gòu):
在Cobra應(yīng)用程序中,main.go文件通常非常簡(jiǎn)單。它有一個(gè)目的:初始化Cobra。
使用cobra生成器
cobra提供了程序用來創(chuàng)建你的應(yīng)用程序然后添加你想添加的命令,這是將cobra引入應(yīng)用程序最簡(jiǎn)單的方式
這兒 你可以發(fā)現(xiàn)關(guān)于cobra的更多信息
要手動(dòng)實(shí)現(xiàn)cobra,需要?jiǎng)?chuàng)建一個(gè)main.go 和rootCmd文件,可以根據(jù)需要提供其他命令
Cobra不需要任何特殊的構(gòu)造器。只需創(chuàng)建命令。
理想情況下,您可以將其放在app/cmd/root.go中:
在init()函數(shù)中定義標(biāo)志和處理配置
例子如下,cmd/root.go:
創(chuàng)建main.go
使用root命令,您需要讓主函數(shù)執(zhí)行它。為清楚起見,Execute應(yīng)該在根目錄下運(yùn)行,盡管它可以在任何命令上調(diào)用。
在Cobra應(yīng)用程序中,main.go文件通常非常簡(jiǎn)單。它有一個(gè)目的:初始化Cobra。
可以定義其他命令,通常每個(gè)命令在cmd/目錄中都有自己的文件。
如果要?jiǎng)?chuàng)建版本命令,可以創(chuàng)建cmd/version.go并用以下內(nèi)容填充它:
如果希望將錯(cuò)誤返回給命令的調(diào)用者,可以使用RunE。
然后可以在execute函數(shù)調(diào)用中捕獲錯(cuò)誤。
標(biāo)志提供修飾符來控制操作命令的操作方式。
由于標(biāo)志是在不同的位置定義和使用的,因此我們需要在外部定義一個(gè)具有正確作用域的變量來分配要使用的標(biāo)志。
有兩種不同的方法來分配標(biāo)志。
標(biāo)志可以是“持久”的,這意味著該標(biāo)志將可用于分配給它的命令以及該命令下的每個(gè)命令。對(duì)于全局標(biāo)志,在根上指定一個(gè)標(biāo)志作為持久標(biāo)志。
也可以在本地分配一個(gè)標(biāo)志,該標(biāo)志只應(yīng)用于該特定命令。
默認(rèn)情況下,Cobra只解析目標(biāo)命令上的本地標(biāo)志,而忽略父命令上的任何本地標(biāo)志。通過啟用Command.TraverseChildren,Cobra將在執(zhí)行目標(biāo)命令之前解析每個(gè)命令上的本地標(biāo)志。
使用viper綁定標(biāo)志
在本例中,持久標(biāo)志author與viper綁定。注意:當(dāng)用戶未提供--author標(biāo)志時(shí),變量author將不會(huì)設(shè)置為config中的值。
更多關(guān)于 viper的文檔
Flags默認(rèn)是可選的,如果希望命令在未設(shè)置標(biāo)志時(shí)報(bào)告錯(cuò)誤,請(qǐng)根據(jù)需要進(jìn)行標(biāo)記:
持久性Flags
可以使用命令的Args字段指定位置參數(shù)的驗(yàn)證。
內(nèi)置了以下驗(yàn)證器:
在下面的示例中,我們定義了三個(gè)命令。兩個(gè)是頂級(jí)命令,一個(gè)(cmdTimes)是頂級(jí)命令之一的子命令。在這種情況下,根是不可執(zhí)行的,這意味著需要一個(gè)子命令。這是通過不為“rootCmd”提供“Run”來實(shí)現(xiàn)的。
我們只為一個(gè)命令定義了一個(gè)標(biāo)志。
有關(guān)標(biāo)志的更多文檔,請(qǐng)?jiān)L問
對(duì)于一個(gè)更完整的例子更大的應(yīng)用程序,請(qǐng)檢查 Hugo 。
當(dāng)您有子命令時(shí),Cobra會(huì)自動(dòng)將help命令添加到應(yīng)用程序中。當(dāng)用戶運(yùn)行“應(yīng)用程序幫助”時(shí),將調(diào)用此函數(shù)。此外,help還支持所有其他命令作為輸入。例如,您有一個(gè)名為“create”的命令,沒有任何附加配置;調(diào)用“app help create”時(shí),Cobra將起作用。每個(gè)命令都會(huì)自動(dòng)添加“-help”標(biāo)志。
以下輸出由Cobra自動(dòng)生成。除了命令和標(biāo)志定義之外,不需要任何東西。
幫助就像其他命令一樣。它周圍沒有特殊的邏輯或行為。事實(shí)上,你可以提供你想提供的。
您可以為默認(rèn)命令提供自己的幫助命令或模板,以用于以下功能:
當(dāng)用戶提供無效的標(biāo)志或無效的命令時(shí),Cobra通過向用戶顯示“用法”來響應(yīng)。
你可以從上面的幫助中認(rèn)識(shí)到這一點(diǎn)。這是因?yàn)槟J(rèn)幫助將用法作為其輸出的一部分嵌入。
您可以提供自己的使用函數(shù)或模板供Cobra使用。與幫助一樣,函數(shù)和模板也可以通過公共方法重寫:
如果在root命令上設(shè)置了version字段,Cobra會(huì)添加一個(gè)頂級(jí)的'--version'標(biāo)志。運(yùn)行帶有“-version”標(biāo)志的應(yīng)用程序?qū)⑹褂冒姹灸0鍖姹敬蛴〉綐?biāo)準(zhǔn)輸出??梢允褂胏md.SetVersionTemplate(s string)函數(shù)自定義模板。
可以在命令的主運(yùn)行函數(shù)之前或之后運(yùn)行函數(shù)。PersistentPreRun和PreRun函數(shù)將在運(yùn)行之前執(zhí)行。PersistentPostRun和PostRun將在運(yùn)行后執(zhí)行。如果子函數(shù)不聲明自己的函數(shù),則它們將繼承Persistent*Run函數(shù)。這些函數(shù)按以下順序運(yùn)行:
輸出:
當(dāng)發(fā)生“未知命令”錯(cuò)誤時(shí),Cobra將打印自動(dòng)建議。這使得Cobra在發(fā)生拼寫錯(cuò)誤時(shí)的行為類似于git命令。例如:
基于注冊(cè)的每個(gè)子命令和Levenshtein距離的實(shí)現(xiàn),建議是自動(dòng)的。匹配最小距離2(忽略大小寫)的每個(gè)已注冊(cè)命令都將顯示為建議。
如果需要在命令中禁用建議或調(diào)整字符串距離,請(qǐng)使用:
or
您還可以使用SuggestFor屬性顯式設(shè)置將為其建議給定命令的名稱。這允許對(duì)在字符串距離方面不接近的字符串提供建議,但在您的一組命令中是有意義的,并且對(duì)于某些您不需要?jiǎng)e名的字符串。例子:
Cobra可以基于子命令、標(biāo)志等生成文檔。請(qǐng)?jiān)?docs generation文檔 中閱讀更多關(guān)于它的信息。
Cobra可以為以下shell生成shell完成文件:bash、zsh、fish、PowerShell。如果您在命令中添加更多信息,這些補(bǔ)全功能將非常強(qiáng)大和靈活。在 Shell Completions 中閱讀更多關(guān)于它的信息。
Cobra is released under the Apache 2.0 license. See LICENSE.txt
命令如下:
直接在終端中輸入gohelp即可顯示所有的go命令以及相應(yīng)命令功能簡(jiǎn)介,主要有下面這些:
build:編譯包和依賴;clean:移除對(duì)象文件;doc:顯示包或者符號(hào)的文檔;env:打印go的環(huán)境信息;bug:啟動(dòng)錯(cuò)誤報(bào)告;fix:運(yùn)行g(shù)otoolfix;fmt:運(yùn)行g(shù)ofmt進(jìn)行格式化;generate:從processingsource生成go文件
get:下載并安裝包和依賴;install:編譯并安裝包和依賴;list:列出包;run:編譯并運(yùn)行g(shù)o程序;test:運(yùn)行測(cè)試;tool:運(yùn)行g(shù)o提供的工具;version:顯示go的版本;vet:運(yùn)行g(shù)otoolvet;命令的使用方式為:gocommand[args],除此之外,可以使用gohelp;來顯示指定命令的更多幫助信息。;在運(yùn)行g(shù)ohelp時(shí),不僅僅打印了這些命令的基本信息,還給出了一些概念的幫助信息:;c:Go和c的相互調(diào)用;buildmode:構(gòu)建模式的描述;filetype:文件類型;gopath:GOPATH環(huán)境變量
environment:環(huán)境變量;importpath:導(dǎo)入路徑語法;packages:包列表的描述;testflag:測(cè)試符號(hào)描述;testfunc:測(cè)試函數(shù)描述等。
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是我寫的go語言項(xiàng)目的工程目錄;
F:\workspace\goSample01\bin是go語言項(xiàng)目的工程目錄下的可執(zhí)行文件路徑;
3、在完成環(huán)境變量配置后,打開一個(gè)命令行窗口,直接輸入go,然后回車,看看是否出現(xiàn)go的幫助信息。如果出現(xiàn),那么go的基本環(huán)境就OK了。
注意:這個(gè)基本環(huán)境不包含開發(fā)工具,也不能直接編譯帶C代碼的go程序。
4、
(可選)為了支持Import遠(yuǎn)程包,最好裝個(gè)gomingw。下載地址:
/downloads/list。如果下的是壓縮包,請(qǐng)把它解壓到C盤。例如,C:\gowin-env。里面有個(gè)Console.bat是以后使用go
get的環(huán)境。舉例:有個(gè)文件a.go,里面import(
"fmt"
"github點(diǎn)抗 /astaxie/beedb"
_ "github點(diǎn)抗 /ziutek/mymysql/godrv"
為了編譯該a.go文件,需要啟動(dòng)Console.bat,然后在該命令行窗口,進(jìn)入c:\go\src目錄下,執(zhí)行g(shù)o getgithub點(diǎn)抗 /astaxie/beedb
Go get github點(diǎn)抗 /ziutek/mymysql/godrv .
Go會(huì)自動(dòng)下載該遠(yuǎn)程包并編譯和安裝這些包。
配置goclipse(可選)
(如果不喜歡eclipse開發(fā)工具,請(qǐng)?zhí)^這個(gè)配置。)
1、下載并安裝goclipse插件。Goclipse是go語言for eclipse的插件,下載地址:
2、啟動(dòng)eclipse并創(chuàng)建go項(xiàng)目。然后寫個(gè)最簡(jiǎn)單的helloworld.go文件,并運(yùn)行。代碼如下:
packagemainimport"fmt"func main(){ fmt.Printf("hello, world")}
配置gocode(可選)
如果不需要go語法輔助和eclipse里面的(按ALT+/)彈出go語言自動(dòng)輔助功能,請(qǐng)?zhí)^這個(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步。否則,就需要通過git下載gocode源文件,然后再編譯。在命令行執(zhí)行:go get -u github點(diǎn)抗 /nsf/gocode 。就會(huì)生成gocode.exe文件。
5、在goclipse插件里面指定gocode的路徑。就可以在elcipse里面調(diào)用gocode來幫助寫編碼了。
從開發(fā)工具這塊看,go語言還不夠成熟,開發(fā)工具都還不完善,有待改進(jìn)。
下載go-tour教程源代碼(可選)
Google有個(gè)在線運(yùn)行g(shù)o語言的教程(),很不錯(cuò)。支持在web上直接運(yùn)行大部分的go程序,想了解這個(gè)教程的源代碼的朋友可以通過以下方式獲取。如果沒興趣,可以跳過這個(gè)步驟。
1、下載安裝Mercurial軟件。
2、在命令行下輸入:
hg 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來啟動(dòng)編譯和運(yùn)行窗口。
4、編寫一個(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還有些編譯問題,同樣的代碼轉(zhuǎn)移到蘋果的XCODE下就沒有問題。后來終于發(fā)現(xiàn)原因了,原來有些例子是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了。