Go語言的構建方法總結

趁着近期要換工做的空閒時間,看了一下Go語言,與C++相比,Go語言的確在很多地方輕便了很多,例如:增長了內置的字符串類型、多個返回值、支持協程、簡單的構建方法等等。使得在生產效率方面有了很多的提升。今天這裏對Go語言的構建方法作個簡單的總結。linux

在C/C++的工程中,極少使用單個命令來編譯代碼,通常是經過一些工具來進行自動化的編譯,剛開始的時候手動寫makefile,再後來是繁複的Autotools,以後又出現了CMake,按照時間的推移,所需咱們作的工做愈來愈少,例如在Autotools咱們大體須要以下工做:算法

  1. autoscan掃描工做目錄,以後手動修改生成的configure.ac。
  2. 使用aclocal命令,經過configure.ac來生成aclocal.m4。
  3. 使用autoconf命令生成configure腳本。
  4. 使用autoheader命令生成config.h.in。
  5. 手動建立Makefile.am文件,按照工程須要配置後再使用automake命令來生成Makefile.in文件。
  6. 再執行configure腳本,最後生成Makefile。

完成上述步驟後,才能夠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語言編程

相關文章
相關標籤/搜索