在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ GO/ 1.3 Go 命令
7 文本處理
3 Web基礎(chǔ)
14 擴(kuò)展Web框架
10.4 小結(jié)
2.2 Go基礎(chǔ)
2.8 總結(jié)
6.1 session和cookie
5.5 使用beedb庫進(jìn)行ORM開發(fā)
8.3 REST
13.6 小結(jié)
5.4 使用PostgreSQL數(shù)據(jù)庫
14.6 pprof支持
14.1 靜態(tài)文件支持
11.2 使用GDB調(diào)試
7.7 小結(jié)
1 GO環(huán)境配置
14.5 多語言支持
7.1 XML處理
1.5 總結(jié)
13 如何設(shè)計(jì)一個(gè)Web框架
14.3 表單及驗(yàn)證支持
12 部署與維護(hù)
10 國際化和本地化
1.1 Go 安裝
6.2 Go如何使用session
5.6 NOSQL數(shù)據(jù)庫操作
6.5 小結(jié)
9.4 避免SQL注入
12.1 應(yīng)用日志
4.2 驗(yàn)證表單的輸入
10.1 設(shè)置默認(rèn)地區(qū)
1.3 Go 命令
9.6 加密和解密數(shù)據(jù)
4.1 處理表單的輸入
4.4 防止多次遞交表單
11.3 Go怎么寫測試用例
8 Web服務(wù)
12.3 應(yīng)用部署
5.7 小結(jié)
12.5 小結(jié)
11 錯(cuò)誤處理,調(diào)試和測試
9.2 確保輸入過濾
14.2 Session支持
6.4 預(yù)防session劫持
12.4 備份和恢復(fù)
8.1 Socket編程
13.1 項(xiàng)目規(guī)劃
13.4 日志和配置設(shè)計(jì)
7.6 字符串處理
13.2 自定義路由器設(shè)計(jì)
6.3 session存儲
3.4 Go的http包詳解
8.2 WebSocket
10.3 國際化站點(diǎn)
7.5 文件操作
7.4 模板處理
9.1 預(yù)防CSRF攻擊
13.3 controller設(shè)計(jì)
2.6 interface
14.4 用戶認(rèn)證
2.3 流程和函數(shù)
附錄A 參考資料
11.1 錯(cuò)誤處理
9.5 存儲密碼
9.3 避免XSS攻擊
12.2 網(wǎng)站錯(cuò)誤處理
6 session和數(shù)據(jù)存儲
2.4 struct類型
3.3 Go如何使得Web工作
2.5 面向?qū)ο?/span>
3.1 Web工作方式
1.2 GOPATH與工作空間
2.1 你好,Go
9.7 小結(jié)
13.5 實(shí)現(xiàn)博客的增刪改
7.2 JSON處理
10.2 本地化資源
7.3 正則處理
2 Go語言基礎(chǔ)
5.1 database/sql接口
4.5 處理文件上傳
8.5 小結(jié)
4.3 預(yù)防跨站腳本
5.3 使用SQLite數(shù)據(jù)庫
14.7 小結(jié)
3.2 Go搭建一個(gè)Web服務(wù)器
2.7 并發(fā)
5 訪問數(shù)據(jù)庫
4 表單
3.5 小結(jié)
1.4 Go開發(fā)工具
11.4 小結(jié)
9 安全與加密
5.2 使用MySQL數(shù)據(jù)庫
4.6 小結(jié)
8.4 RPC

1.3 Go 命令

Go 命令

Go語言自帶有一套完整的命令操作工具,你可以通過在命令行中執(zhí)行go來查看它們:

http://wiki.jikexueyuan.com/project/go-web-programming/images/1.1.mac.png" alt="" />

圖1.3 Go命令顯示詳細(xì)的信息

這些命令對于我們平時(shí)編寫的代碼非常有用,接下來就讓我們了解一些常用的命令。

go build

這個(gè)命令主要用于編譯代碼。在包的編譯過程中,若有必要,會同時(shí)編譯與之相關(guān)聯(lián)的包。

  • 如果是普通包,就像我們在1.2節(jié)中編寫的mymath包那樣,當(dāng)你執(zhí)行go build之后,它不會產(chǎn)生任何文件。如果你需要在$GOPATH/pkg下生成相應(yīng)的文件,那就得執(zhí)行go install。

  • 如果是main包,當(dāng)你執(zhí)行go build之后,它就會在當(dāng)前目錄下生成一個(gè)可執(zhí)行文件。如果你需要在$GOPATH/bin下生成相應(yīng)的文件,需要執(zhí)行go install,或者使用go build -o 路徑/a.exe

  • 如果某個(gè)項(xiàng)目文件夾下有多個(gè)文件,而你只想編譯某個(gè)文件,就可在go build之后加上文件名,例如go build a.go;go build命令默認(rèn)會編譯當(dāng)前目錄下的所有g(shù)o文件。

  • 你也可以指定編譯輸出的文件名。例如1.2節(jié)中的mathapp應(yīng)用,我們可以指定go build -o astaxie.exe,默認(rèn)情況是你的package名(非main包),或者是第一個(gè)源文件的文件名(main包)。

    (注:實(shí)際上,package名在Go語言規(guī)范中指代碼中“package”后使用的名稱,此名稱可以與文件夾名不同。默認(rèn)生成的可執(zhí)行文件名是文件夾名。)

  • go build會忽略目錄下以“_”或“.”開頭的go文件。

  • 如果你的源代碼針對不同的操作系統(tǒng)需要不同的處理,那么你可以根據(jù)不同的操作系統(tǒng)后綴來命名文件。例如有一個(gè)讀取數(shù)組的程序,它對于不同的操作系統(tǒng)可能有如下幾個(gè)源文件:

    array_linux.go array_darwin.go array_windows.go array_freebsd.go

    go build的時(shí)候會選擇性地編譯以系統(tǒng)名結(jié)尾的文件(Linux、Darwin、Windows、Freebsd)。例如Linux系統(tǒng)下面編譯只會選擇array_linux.go文件,其它系統(tǒng)命名后綴文件全部忽略。

參數(shù)的介紹

  • -o 指定輸出的文件名,可以帶上路徑,例如 go build -o a/b/c
  • -i 安裝相應(yīng)的包,編譯+go install
  • -a 更新全部已經(jīng)是最新的包的,但是對標(biāo)準(zhǔn)包不適用
  • -n 把需要執(zhí)行的編譯命令打印出來,但是不執(zhí)行,這樣就可以很容易的知道底層是如何運(yùn)行的
  • -p n 指定可以并行可運(yùn)行的編譯數(shù)目,默認(rèn)是CPU數(shù)目
  • -race 開啟編譯的時(shí)候自動檢測數(shù)據(jù)競爭的情況,目前只支持64位的機(jī)器
  • -v 打印出來我們正在編譯的包名
  • -work 打印出來編譯時(shí)候的臨時(shí)文件夾名稱,并且如果已經(jīng)存在的話就不要刪除
  • -x 打印出來執(zhí)行的命令,其實(shí)就是和-n的結(jié)果類似,只是這個(gè)會執(zhí)行
  • -ccflags 'arg list' 傳遞參數(shù)給5c, 6c, 8c 調(diào)用
  • -compiler name 指定相應(yīng)的編譯器,gccgo還是gc
  • -gccgoflags 'arg list' 傳遞參數(shù)給gccgo編譯連接調(diào)用
  • -gcflags 'arg list' 傳遞參數(shù)給5g, 6g, 8g 調(diào)用
  • -installsuffix suffix 為了和默認(rèn)的安裝包區(qū)別開來,采用這個(gè)前綴來重新安裝那些依賴的包,-race的時(shí)候默認(rèn)已經(jīng)是-installsuffix race,大家可以通過-n命令來驗(yàn)證
  • -ldflags 'flag list' 傳遞參數(shù)給5l, 6l, 8l 調(diào)用
  • -tags 'tag list' 設(shè)置在編譯的時(shí)候可以適配的那些tag,詳細(xì)的tag限制參考里面的 Build Constraints

go clean

這個(gè)命令是用來移除當(dāng)前源碼包和關(guān)聯(lián)源碼包里面編譯生成的文件。這些文件包括

_obj/            舊的object目錄,由Makefiles遺留
_test/           舊的test目錄,由Makefiles遺留
_testmain.go     舊的gotest文件,由Makefiles遺留
test.out         舊的test記錄,由Makefiles遺留
build.out        舊的test記錄,由Makefiles遺留
*.[568ao]        object文件,由Makefiles遺留

DIR(.exe)        由go build產(chǎn)生
DIR.test(.exe)   由go test -c產(chǎn)生
MAINFILE(.exe)   由go build MAINFILE.go產(chǎn)生
*.so             由 SWIG 產(chǎn)生

我一般都是利用這個(gè)命令清除編譯文件,然后github遞交源碼,在本機(jī)測試的時(shí)候這些編譯文件都是和系統(tǒng)相關(guān)的,但是對于源碼管理來說沒必要。

$ go clean -i -n
cd /Users/astaxie/develop/gopath/src/mathapp
rm -f mathapp mathapp.exe mathapp.test mathapp.test.exe app app.exe
rm -f /Users/astaxie/develop/gopath/bin/mathapp

參數(shù)介紹

  • -i 清除關(guān)聯(lián)的安裝的包和可運(yùn)行文件,也就是通過go install安裝的文件
  • -n 把需要執(zhí)行的清除命令打印出來,但是不執(zhí)行,這樣就可以很容易的知道底層是如何運(yùn)行的
  • -r 循環(huán)的清除在import中引入的包
  • -x 打印出來執(zhí)行的詳細(xì)命令,其實(shí)就是-n打印的執(zhí)行版本

go fmt

有過C/C++經(jīng)驗(yàn)的讀者會知道,一些人經(jīng)常為代碼采取K&R風(fēng)格還是ANSI風(fēng)格而爭論不休。在go中,代碼則有標(biāo)準(zhǔn)的風(fēng)格。由于之前已經(jīng)有的一些習(xí)慣或其它的原因我們常將代碼寫成ANSI風(fēng)格或者其它更合適自己的格式,這將為人們在閱讀別人的代碼時(shí)添加不必要的負(fù)擔(dān),所以go強(qiáng)制了代碼格式(比如左大括號必須放在行尾),不按照此格式的代碼將不能編譯通過,為了減少浪費(fèi)在排版上的時(shí)間,go工具集中提供了一個(gè)go fmt命令 它可以幫你格式化你寫好的代碼文件,使你寫代碼的時(shí)候不需要關(guān)心格式,你只需要在寫完之后執(zhí)行go fmt <文件名>.go,你的代碼就被修改成了標(biāo)準(zhǔn)格式,但是我平常很少用到這個(gè)命令,因?yàn)殚_發(fā)工具里面一般都帶了保存時(shí)候自動格式化功能,這個(gè)功能其實(shí)在底層就是調(diào)用了go fmt。接下來的一節(jié)我將講述兩個(gè)工具,這兩個(gè)工具都自帶了保存文件時(shí)自動化go fmt功能。

使用go fmt命令,其實(shí)是調(diào)用了gofmt,而且需要參數(shù)-w,否則格式化結(jié)果不會寫入文件。gofmt -w -l src,可以格式化整個(gè)項(xiàng)目。

所以go fmt是gofmt的上層一個(gè)包裝的命令,我們想要更多的個(gè)性化的格式化可以參考 gofmt

gofmt的參數(shù)介紹

  • -l 顯示那些需要格式化的文件
  • -w 把改寫后的內(nèi)容直接寫入到文件中,而不是作為結(jié)果打印到標(biāo)準(zhǔn)輸出。
  • -r 添加形如“a[b:len(a)] -> a[b:]”的重寫規(guī)則,方便我們做批量替換
  • -s 簡化文件中的代碼
  • -d 顯示格式化前后的diff而不是寫入文件,默認(rèn)是false
  • -e 打印所有的語法錯(cuò)誤到標(biāo)準(zhǔn)輸出。如果不使用此標(biāo)記,則只會打印不同行的前10個(gè)錯(cuò)誤。
  • -cpuprofile 支持調(diào)試模式,寫入相應(yīng)的cpufile到指定的文件

go get

這個(gè)命令是用來動態(tài)獲取遠(yuǎn)程代碼包的,目前支持的有BitBucket、GitHub、Google Code和Launchpad。這個(gè)命令在內(nèi)部實(shí)際上分成了兩步操作:第一步是下載源碼包,第二步是執(zhí)行go install。下載源碼包的go工具會自動根據(jù)不同的域名調(diào)用不同的源碼工具,對應(yīng)關(guān)系如下:

BitBucket (Mercurial Git)
GitHub (Git)
Google Code Project Hosting (Git, Mercurial, Subversion)
Launchpad (Bazaar)

所以為了go get 能正常工作,你必須確保安裝了合適的源碼管理工具,并同時(shí)把這些命令加入你的PATH中。其實(shí)go get支持自定義域名的功能,具體參見go help remote。

參數(shù)介紹:

  • -d 只下載不安裝
  • -f 只有在你包含了-u參數(shù)的時(shí)候才有效,不讓-u去驗(yàn)證import中的每一個(gè)都已經(jīng)獲取了,這對于本地fork的包特別有用
  • -fix 在獲取源碼之后先運(yùn)行fix,然后再去做其他的事情
  • -t 同時(shí)也下載需要為運(yùn)行測試所需要的包
  • -u 強(qiáng)制使用網(wǎng)絡(luò)去更新包和它的依賴包
  • -v 顯示執(zhí)行的命令

go install

這個(gè)命令在內(nèi)部實(shí)際上分成了兩步操作:第一步是生成結(jié)果文件(可執(zhí)行文件或者.a包),第二步會把編譯好的結(jié)果移到$GOPATH/pkg或者$GOPATH/bin。

參數(shù)支持go build的編譯參數(shù)。大家只要記住一個(gè)參數(shù)-v就好了,這個(gè)隨時(shí)隨地的可以查看底層的執(zhí)行信息。

go test

執(zhí)行這個(gè)命令,會自動讀取源碼目錄下面名為*_test.go的文件,生成并運(yùn)行測試用的可執(zhí)行文件。輸出的信息類似

ok   archive/tar   0.011s
FAIL archive/zip   0.022s
ok   compress/gzip 0.033s
...

默認(rèn)的情況下,不需要任何的參數(shù),它會自動把你源碼包下面所有test文件測試完畢,當(dāng)然你也可以帶上參數(shù),詳情請參考go help testflag

這里我介紹幾個(gè)我們常用的參數(shù):

  • -bench regexp 執(zhí)行相應(yīng)的benchmarks,例如 -bench=.
  • -cover 開啟測試覆蓋率
  • -run regexp 只運(yùn)行regexp匹配的函數(shù),例如 -run=Array 那么就執(zhí)行包含有Array開頭的函數(shù)
  • -v 顯示測試的詳細(xì)命令

go tool

go tool下面下載聚集了很多命令,這里我們只介紹兩個(gè),fix和vet

  • go tool fix . 用來修復(fù)以前老版本的代碼到新版本,例如go1之前老版本的代碼轉(zhuǎn)化到go1,例如API的變化
  • go tool vet directory|files 用來分析當(dāng)前目錄的代碼是否都是正確的代碼,例如是不是調(diào)用fmt.Printf里面的參數(shù)不正確,例如函數(shù)里面提前return了然后出現(xiàn)了無用代碼之類的。

go generate

這個(gè)命令是從Go1.4開始才設(shè)計(jì)的,用于在編譯前自動化生成某類代碼。go generatego build是完全不一樣的命令,通過分析源碼中特殊的注釋,然后執(zhí)行相應(yīng)的命令。這些命令都是很明確的,沒有任何的依賴在里面。而且大家在用這個(gè)之前心里面一定要有一個(gè)理念,這個(gè)go generate是給你用的,不是給使用你這個(gè)包的人用的,是方便你來生成一些代碼的。

這里我們來舉一個(gè)簡單的例子,例如我們經(jīng)常會使用yacc來生成代碼,那么我們常用這樣的命令:

go tool yacc -o gopher.go -p parser gopher.y

-o 指定了輸出的文件名, -p指定了package的名稱,這是一個(gè)單獨(dú)的命令,如果我們想讓go generate來觸發(fā)這個(gè)命令,那么就可以在當(dāng)然目錄的任意一個(gè)xxx.go文件里面的任意位置增加一行如下的注釋:

//go:generate go tool yacc -o gopher.go -p parser gopher.y

這里我們注意了,//go:generate是沒有任何空格的,這其實(shí)就是一個(gè)固定的格式,在掃描源碼文件的時(shí)候就是根據(jù)這個(gè)來判斷的。

所以我們可以通過如下的命令來生成,編譯,測試。如果gopher.y文件有修改,那么就重新執(zhí)行go generate重新生成文件就好。

$ go generate
$ go build
$ go test

godoc

在Go1.2版本之前還支持go doc命令,但是之后全部已到了godoc這個(gè)命令下,需要這樣安裝go get golang.org/x/tools/cmd/godoc

很多人說go不需要任何的第三方文檔,例如chm手冊之類的(其實(shí)我已經(jīng)做了一個(gè)了,chm手冊),因?yàn)樗鼉?nèi)部就有一個(gè)很強(qiáng)大的文檔工具。

如何查看相應(yīng)package的文檔呢? 例如builtin包,那么執(zhí)行godoc builtin 如果是http包,那么執(zhí)行godoc net/http 查看某一個(gè)包里面的函數(shù),那么執(zhí)行godoc fmt Printf 也可以查看相應(yīng)的代碼,執(zhí)行godoc -src fmt Printf

通過命令在命令行執(zhí)行 godoc -http=:端口號 比如godoc -http=:8080。然后在瀏覽器中打開127.0.0.1:8080,你將會看到一個(gè)golang.org的本地copy版本,通過它你可以查詢pkg文檔等其它內(nèi)容。如果你設(shè)置了GOPATH,在pkg分類下,不但會列出標(biāo)準(zhǔn)包的文檔,還會列出你本地GOPATH中所有項(xiàng)目的相關(guān)文檔,這對于經(jīng)常被墻的用戶來說是一個(gè)不錯(cuò)的選擇。

其它命令

go還提供了其它很多的工具,例如下面的這些工具

go version 查看go當(dāng)前的版本
go env 查看當(dāng)前go的環(huán)境變量
go list 列出當(dāng)前全部安裝的package
go run 編譯并運(yùn)行Go程序

以上這些工具還有很多參數(shù)沒有一一介紹,用戶可以使用go help 命令獲取更詳細(xì)的幫助信息。