小議並實戰go包-----順便說說go中的GOROOT,GOPATH和src,pkg,bin
工作目錄是:/home/ubuntu/taoge/go/proj, 在該目錄下,建立一個src/main目錄,其中有main.go檔案:
[email protected]:~/taoge/go/proj$ pwd
/home/ubuntu/taoge/go/proj
[email protected]:~/taoge/go/proj$ cd src/main/
[email protected]:~/taoge/go/proj/src/main$ ls
main.go
[email protected]:~/taoge/go/proj/src/main$
main.go內容:
package main
import (
"calc/add"
"calc/subtract"
"fmt"
)
func main() {
fmt.Println(add.Add(1, 2))
fmt.Println(subtract.Subtract(1, 2))
}
編譯執行一下:
[email protected]:~/taoge/go/proj/src/main$ go run main.go
main.go:4:2: cannot find package "calc/add" in any of:
/usr/lib/go-1.6/src/calc/add (from $GOROOT)
/home/ubuntu/go/src/calc/add (from $GOPATH)
main.go:5:2: cannot find package "calc/subtract" in any of:
/usr/lib/go-1.6/src/calc/subtract (from $GOROOT)
/home/ubuntu/go/src/calc/subtract (from $GOPATH)
[email protected]:~/taoge/go/proj/src/main$
提示在GOROOT和GOPATH對應的目錄下沒法找到calc/add和calc/subtract包。必然的! 因為我們根本就沒有實現這兩個包, 所以, 還是老老實實的來寫calc/add和calc/subtract包吧:
[email protected]:~/taoge/go/proj/src$ ls
calc main
[email protected]:~/taoge/go/proj/src$ ls calc/add/
add.go
[email protected]:~/taoge/go/proj/src$ ls calc/subtract/
subtract.go
[email protected]:~/taoge/go/proj/src$
add.go程式碼:
package add
func Add(x, y int) int {
return x + y
}
subtract.go程式碼:
package subtract
func Subtract(x, y int) int {
return x - y
}
好了, 再次來編譯並執行一下main.go:
[email protected]:~/taoge/go/proj/src/main$ go run main.go
main.go:4:2: cannot find package "calc/add" in any of:
/usr/lib/go-1.6/src/calc/add (from $GOROOT)
/home/ubuntu/go/src/calc/add (from $GOPATH)
main.go:5:2: cannot find package "calc/subtract" in any of:
/usr/lib/go-1.6/src/calc/subtract (from $GOROOT)
/home/ubuntu/go/src/calc/subtract (from $GOPATH)
[email protected]:~/taoge/go/proj/src/main$
還是不行, 為什麼呢? 因為去找的路徑是GOROOT和GOPATH, 而我們寫的add和subtract並不在這兩個目錄下, 怎麼辦?直接加到GOPATH中去即可(因為GOROOT是go的安裝路徑, 所以不建議修改GOROOT, 而是修改與工程目錄有關的GOPATH), 如下:
[email protected]:~/taoge/go/proj/src/main$ echo $GOPATH
/home/ubuntu/go
[email protected]:~/taoge/go/proj/src/main$ GOPATH=$GOPATH:/home/ubuntu/taoge/go/proj
[email protected]:~/taoge/go/proj/src/main$ echo $GOPATH
/home/ubuntu/go:/home/ubuntu/taoge/go/proj
[email protected]:~/taoge/go/proj/src/main$
[email protected]:~/taoge/go/proj/src/main$
[email protected]:~/taoge/go/proj/src/main$ go run main.go
3
-1
[email protected]:~/taoge/go/proj/src/main$
終於OK.
幾個點需要注意(僅以add為例,subtract同理):
1. add.go中的Add函式名首字母必須大寫, 比如Add, Addxxx.
2. add.go的改名為addyyy.go也可以,查詢add包的時候,並不會根據add.go這個檔名來查詢。
3. 把calc/add目錄改為calc/addzzz則不行, 因為在main.go中,import的是calc/add路徑, 當然, 如果同步改掉main.go中的import內容為calc/addzzz, 也是可以的。 特別注意:此時add.go中package的add宣告和main.go中的add包呼叫不一定要改為addzzz, 所以, 嚴格地說,import的是包所在的路徑, 而不是包名。完全可以import calc/addzzz, 而包名依然為add. 但是,強烈建議這四處統一一致。
4. main中呼叫add.Add(1,2)時,add是包, 必須跟add.go中的package處的add包名一致,否則錯誤。
5. import後, 怎麼去查詢對應的包呢? 思考一下, 很簡單,無非就是GOROOT和GOPATH. 也應該明白了, src這個目錄名可不是能隨便取的。
其實, 這些都是非常基礎的, 也很好理解。
借這個例子, 我們來說說go的src,pkg, bin, 當前的目錄結構如下:
[email protected]:~/taoge/go/proj$ tree
src
calc
add
add.go
subtract
subtract.go
main
main.go
5 directories, 3 files
在main目錄下執行go run main.go的時候, 並不會產生新的檔案, 而執行go build main.go的時候, 會產生新的可執行檔案main, 如下:
[email protected]:~/taoge/go/proj/src/main$ go run main.go
3
-1
[email protected]:~/taoge/go/proj/src/main$ ls
main.go
[email protected]:~/taoge/go/proj/src/main$
[email protected]:~/taoge/go/proj/src/main$
[email protected]:~/taoge/go/proj/src/main$ go build main.go
[email protected]:~/taoge/go/proj/src/main$ ls
main main.go
[email protected]:~/taoge/go/proj/src/main$ ./main
3
-1
[email protected]untu:~/taoge/go/proj/src/main$
好的, 我們把上述可執行檔案main刪除, 當前工程中的目錄如下:
[email protected]:~/taoge/go/proj$ tree
src
calc
add
add.go
subtract
subtract.go
main
main.go
5 directories, 3 files
因為GOPATH已經包括了我們的工作目錄:
[email protected]:~/taoge/go/proj$ echo $GOPATH
/home/ubuntu/go:/home/ubuntu/taoge/go/proj
[email protected]:~/taoge/go/proj$
所以可以在任何目錄下執行go install xxx命令, 來看下:
[email protected]:~/taoge/go/proj$ cd
[email protected]:~$ pwd
/home/ubuntu
[email protected]:~$ go install calc/add
[email protected]:~$ go install calc/subtract
[email protected]:~$
來看看目錄有什麼變化:
[email protected]:~$ cd -
/home/ubuntu/taoge/go/proj
[email protected]:~/taoge/go/proj$ tree
pkg
linux_amd64
calc
add.a
subtract.a
src
calc
add
add.go
subtract
subtract.go
main
main.go
8 directories, 5 files
[email protected]:~/taoge/go/proj$
可以看到, 多了pkg目錄, 裡面有什麼呢? 一看便知, 其中.a檔案是不是很像之前在C++中經常用到的靜態庫?
我們繼續在任何目錄下來install, 如下:
[email protected]:~/taoge/go/proj$ cd -
/home/ubuntu
[email protected]:~$ go install main
結果有什麼變化呢?來看看:
[email protected]:~$ cd -
/home/ubuntu/taoge/go/proj
[email protected]:~/taoge/go/proj$ tree
bin
main
pkg
linux_amd64
calc
add.a
subtract.a
src
calc
add
add.go
subtract
subtract.go
main
main.go
9 directories, 6 files
[email protected]:~/taoge/go/proj$
[email protected]:~/taoge/go/proj$ ./bin/main
3
-1
[email protected]:~/taoge/go/proj$
對了bin目錄,其中有可執行檔案main, 無需多說。
最後思考一個問題, 刪除pkg和bin目錄, 直接執行go install main (不執行go install calc/add和go install calc/subtract), 會怎樣呢? 結果仍是:
[email protected]:~/taoge/go/proj$ tree
bin
main
pkg
linux_amd64
calc
add.a
subtract.a
src
calc
add
add.go
subtract
subtract.go
main
main.go
9 directories, 6 files
不多說。