趁着近期要換工做的空閒時間,看了一下Go語言,與C++相比,Go語言的確在很多地方輕便了很多,例如:增長了內置的字符串類型、多個返回值、支持協程、簡單的構建方法等等。使得在生產效率方面有了很多的提升。今天這裏對Go語言的構建方法作個簡單的總結。linux
在C/C++的工程中,極少使用單個命令來編譯代碼,通常是經過一些工具來進行自動化的編譯,剛開始的時候手動寫makefile,再後來是繁複的Autotools,以後又出現了CMake,按照時間的推移,所需咱們作的工做愈來愈少,例如在Autotools咱們大體須要以下工做:算法
完成上述步驟後,才能夠make,make install 來完成工程的編譯的安裝。而以後的CMake則簡便很多,只須要配置幾個CMakeList.txt,以後執行CMake命令,便可生成編譯和安裝所需的Makefile文件。編程
雖然隨着技術的發展,C/C++會有更好的構建方法出現。但目前看來,是擺脫不了Makefile的,而在Go1發佈時,捨棄了Makefile,直接引入了更爲方便的方法:**Go命令行工具**。bash
Go命令行工具直接捨棄的工程文件的概念,只經過目錄結構和包的名字來推倒工程結構和構建順序,下面咱們使用一個簡單的例子(取自《Go語言編程》)來講明下Go中的基本工程管理方法。工具
這個例子是一個基於命令行的計算器。基本用法以下所示:單元測試
$calc help USAGE: calc command [argument] ... The Command are: sqrt Square root of a non-negative value add Addation of two values $ calc sqrt 4 #對4進行開方 2 $ calc add 1 2 3
根據需求,咱們能夠把工程分爲兩個部分,主程序和算法庫,這樣,當咱們算法進行更新的時候,只修改實現就能夠了,而不用修改對外的接口,這樣就能夠達到低耦合。工程目錄以下所示:測試
calculator
|----src
|----calc
|----calc.go
|----simplemath
|----add.go
|----add_test.go
|----sqrt.go
|----sqrt_test.go
|----bin
|----pkg
在上面,斜體表示目錄,正常文章表示文件,**xx_test.go表示是對xx.go的單元測試文件**,這是Go工程的命名規則。同時,工程下的目錄src表示是源碼目錄,bin表示安裝後的可執行程序目錄,pkg表示包目錄,這也是Go工程的命名規則。下面就是這個工程的代碼了。
calc.goui
// calc.go
package main
import (
"fmt"
"os"
"simplemath"
"strconv"
)
var Usage = func() {
fmt.Println("USAGE: calc command [arguments]...")
fmt.Println("\nThe commands are: \n\tAddition of two values.\n\tsqrt\tSquare root of a non-negative value")
}
func main() {
args := os.Args
if args == nil || len(args) < 2 {
Usage()
return
}
switch args[0] {
case "add":
if len(args) != 3 {
fmt.Println("USAGE:calc add <integer1> <integer2>")
return
}
v1, err1 := strconv.Atoi(args[1])
v2, err2 := strconv.Atoi(args[2])
if err1 != nil || err2 != nil {
fmt.Println("USAGE:calc add <integer1> <integer2>")
return
}
ret := simplemath.Add(v1, v2)
fmt.Println("Result: ", ret)
case "sqrt":
if len(args) != 2 {
fmt.Println("USAGE: calc sqrt <integer>")
return
}
v, err := strconv.Atoi(args[1])
if err != nil {
fmt.Println("USAGE: calc sqrt <integer>")
return
}
ret := simplemath.Sqrt(v)
fmt.Println("Result: ", ret)
default:
Usage()
}
}
add.gospa
1 // add.go 2 package simplemath 3 4 func Add(a int, b int) int { 5 return a + b 6 }
add_test.go命令行
1 // add_test.go 2 package simplemath 3 4 import "testing" 5 6 func TestAdd1(t *testing.T) { 7 r := Add(1, 2) 8 if r != 3 { 9 t.Errorf("Add(1, 2) failed, Got %d, expected 3", r) 10 } 11 }
sqrt.go
1 // sqrt.go 2 package simplemath 3 4 import "math" 5 6 func Sqrt(i int) int { 7 v := math.Sqrt(float64(i)) 8 return int(v) 9 }
因爲篇幅問題,sqrt的單元測試代碼在此省略。
完成代碼後,就要進行編譯了。首先須要設置環境變量**GOPATH**的值,將**calcuator的目錄賦給GOPATH**,保存後從新載入便可。假設calcuator的目錄是"~/gobuild",那麼在linux下能夠執行如下命令:
export GOPATH=~/gobuild/calcuator
source ~/.bashrc
設置完環境變量後,就能夠開始構建工程了,進入calcuator的目錄,執行命令:
cd bin
go build calc
以後就能夠在目錄下發現名字爲calc的可執行程序。按照先前的功能進行試驗,便可以看到對應的執行結果。
以上就是Go進行構建的過程,按照Go的要求組織好目錄後,真正進行構建的就只是**go build calc**這條命令。能夠說是很是簡單快捷。而一樣,進行單元測試,在bin目錄下執行命令:
go test simplemath便可。
以上就是Go進行構建的一個簡單總結。因爲是剛開始接觸Go語言,若是有錯誤的地方,請指正。謝謝
xiaoniu
[2/30]
參考資料:
Go語言編程