go語言的原始碼服用建立在包(package)基礎之上。go語言的入口main()函式所在的包叫main,main包想要引用別的**,必須同樣以包的方式進行引用。
go語言的包與資料夾一一對應,所有與包相關的操作,必須依賴於工作目錄gopath。
zk@ubuntu:~/go$ echo $gopath
zk@ubuntu:~/go$ go env
goarch="amd64"
gobin=""
goexe=""
gohostarch="amd64"
gohostos="linux"
goos="linux"
gopath=""
gorace=""
goroot="/usr/lib/go-1.6"
gotooldir="/usr/lib/go-1.6/pkg/tool/linux_amd64"
go15vendorexperiment="1"
cc="gcc"
gogccflags="-fpic -m64 -pthread -fmessage-length=0"
cxx="g++"
cgo_enabled="1"
export gopath = `pwd`
包是多個go原始碼的集合,是一種高階的**復用方案。
包要求在同乙個目錄下的所有檔案的第一行新增如下**,以標記該檔案歸屬的包:
package 包名
包的特性如下:
乙個目錄下的同級檔案歸屬乙個包
包名可以與其目錄不同命
包名為main的包為應用程式的入口寶,編譯原始碼沒有main包時,將無法編譯輸出可執行的檔案
在go語言中,如果想在乙個包裡引用另外乙個包裡的識別符號(如型別、變數或常量等)時,必須首先將被引用識別符號匯出,將要匯出的識別符號的首字母大寫就可以讓引用者可以訪問這些識別符號了。
要引用其他包的識別符號,可以使用import關鍵字,匯入的包名需要使用雙引號包圍,包名是從gopath開始計算的路吉林,使用「/」進行路徑分隔。
//單行匯入
import "包1"
import "包2"
//多行匯入
import (
"包1"
"包2"
)
customname "path/to/package"
其中path/to/package為要匯入的包路徑,customname為自定義的包名
如果只希望匯入包,而不使用任何包內的結構和型別也不呼叫包內的任何函式,可以使用匿名匯入包。格式如下:
import (
_ "path/to/package"
)其中path/to/package表示要匯入的包名,下劃線 _ 表示匿名匯入包。
匿名匯入的包與其他方式匯入的包一樣會讓匯入包編譯到可執行檔案中,同時,匯入包也會觸發init()函式呼叫。
包在程式啟動前的初始化入口:init()。init()函式的特性如下:
●每個原始碼可以1個init()函式
●init()函式會在程式執行前(main()函式執行前)被自動呼叫
●呼叫順序為main()中引用的包,以深度優先順序初始化
●同乙個包中多個init()函式的呼叫順序不可預期
●init()函式不能被其他函式呼叫
Go語言學習筆記八 陣列
陣列地球人都知道。所以只說說go語言的特殊 奇葩 寫法。我一直在想乙個人參與了兩種語言的設計,但是最後兩種語言的語法差異這麼大。這是自己否定自己麼,為什麼不與之前統一一下。var variable name size variable type例子 var x 10 intvar x 5 int v...
Go語言學習筆記八 陣列
陣列地球人都知道。所以只說說go語言的特殊 奇葩 寫法。我一直在想乙個人參與了兩種語言的設計,但是最後兩種語言的語法差異這麼大。這是自己否定自己麼,為什麼不與之前統一一下。var variable name size variable type例子 var x 10 intvar x 5 int v...
Go語言學習筆記 閉包
首先這裡的func int int是指函式test 返回乙個函式 類似的,返回多個值是這樣寫 func a int,int,float32 func test func int int func main 書中對閉包的解釋 閉包的概念 是可以包含自由 未繫結到特定物件 變數的 塊,這些變數不在這個 ...