Go簡(jiǎn)介
Go是Google開(kāi)發(fā)的一種靜態(tài)強(qiáng)類(lèi)型羹令、編譯型菱属、并發(fā)型楷拳,并具有垃圾回收功能的編程語(yǔ)言。因其天生并發(fā)方援、編譯后的二進(jìn)制文件可以直接移植運(yùn)行,這使得其與Docker相結(jié)合可以創(chuàng)建完美的微服務(wù)涛癌。
編程風(fēng)格
Go有幾項(xiàng)強(qiáng)制性的編程規(guī)定犯戏,可以幫助程序員強(qiáng)制養(yǎng)成書(shū)寫(xiě)可閱讀的代碼和減少程序中的bug(C語(yǔ)言中忘記(;)是最廣泛的bug)
- 每行程序結(jié)束后不需要撰寫(xiě)分號(hào)(;)。
- 大括號(hào)({)不能夠換行放置拳话。
- if判斷式和for循環(huán)不需要以小括號(hào)包覆起來(lái)先匪。
代碼組織
Go的代碼組織結(jié)構(gòu)如下,Go與其他語(yǔ)言代碼組織不同的是Go內(nèi)置使用Git進(jìn)行版本控制弃衍,在編寫(xiě)庫(kù)文件時(shí)可以直接放在自己的Github上呀非,然后供自己和其他人下載使用。
$GOPATH
├─── bin/ # 放置 go install 生成的可執(zhí)行文件
| └─── hello
├─── pkg/ # 放置 go install 生成的庫(kù)對(duì)象文件
| └─── linux_amd64/github.com/
| ├─── gorilla/mux/
| | └─── mux.a
| └─── lucky-loki/rect/
| └─── rect.a
└─── src/ # 放置庫(kù)文件
└─── github.com
├─── gorilla/mux/ # 外部 Git 庫(kù)
| ├─── .git/
| ├─── mux.go
| └─── ...
└─── lucky-loki/ # 工作區(qū)
├─── hello/
| └─── hello.go # 主程序
└─── rect/
├─── rect.go # 自己編寫(xiě)的庫(kù)文件
└─── rect_test.go # 自己編寫(xiě)的單元測(cè)試文件
示例
編寫(xiě)你的第一個(gè)庫(kù)
mkdir -p $GOPATH/src/github.com/lucky-loki/rect
cd $GOPATH/src/github.com/lucky-loki/rect
vim rect.go
package rect
import "fmt"
type rect struct {
width int
height int
}
func (r *rect) area() int {
return r.width * r.height
}
func Print() bool{
r := rect{ width:10, height:5}
fmt.Printf("area: %d\n", r.area())
return true
}
# 單元測(cè)試*_test.go
vim rect_test.go
package rect
import (
"fmt"
"testing"
)
// 測(cè)試函數(shù)模版 func TestXXX(t *testing.T), 測(cè)試失敗使用t.Error或者t.Fail
func TestRect(t *testing.T) {
fmt.Println("In test rect")
ret := Print()
if ret != true {
t.Errorf("one error happened")
}
}
-
go build
不會(huì)產(chǎn)生輸出文件,它會(huì)將編譯后的包放在本地編譯緩存中岸裙。 -
go install
會(huì)將編譯后的包放在pkg
文件夾中猖败。
# 編譯庫(kù)文件,成功后進(jìn)行單元測(cè)試
cd $GOPATH/src/github.com/lucky-loki/rect
go build && go test
# 或者
go build github.com/lucky-loki/rect
go test github.com/lucky-loki/rect
編寫(xiě)主程序
mkdir -p $GOPATH/src/github.com/lucky-loki/hello
cd $GOPATH/src/github.com/lucky-loki/hello
vim hello.go
- 主程序必須使用
package main
作為包名降允。 -
import "<package>"
會(huì)在$GOROOT/src
和$GOPATH/src
下進(jìn)行包查找恩闻。
package main
import (
"fmt"
"github.com/lucky-loki/rect"
)
func main() {
fmt.Print("Hello World!")
rect.Print()
}
# 編譯主程序,運(yùn)行
cd $GOPATH/src/github.com/lucky-loki/hello
go build && ./hello
# 或者
go build github.com/lucky-loki/hello && ./hello
go install github.com/lucky-loki/hello && $GOPATH/bin/hello
發(fā)布你的庫(kù)
cd $GOPATH/src/github.com/lucky-loki/rect
git init
git add rect.go rect_test.go
git commit -m "initial commit"
git remote add origin https://github.com/lucky-loki/rect.git
git push -u origin master
下載遠(yuǎn)程庫(kù)
go get
會(huì)先將遠(yuǎn)程庫(kù)下載存儲(chǔ)到$GOPATH/src
下拟糕,然后執(zhí)行go install
進(jìn)行庫(kù)編譯生成對(duì)象文件放在$GOPATH/pkg
下或者執(zhí)行主程序編譯放在$GOPATH/bin
下判呕。
go get github.com/gorilla/mux
# 如何導(dǎo)入
# import "github.com/gorilla/mux"