在golang中,所有原始檔都屬於乙個包,golang的包具有以下特性:
golang包的使用依賴乙個重要的環境變數:gopath
,無論是自己的**還是第三方**,都以gopath
作為工作目錄和一套完整的工程目錄規則。gopath目錄約定有三個子目錄,主要用於
gopath
允許多個目錄,設定多個目錄時,需要使用環境變數分隔符來區分。unix/linux的環境變數分隔符是英文輸入法下的冒號(:),windows的環境變數分隔符是英文分號(;)。
使用gopath
時,golang會在以下目錄中搜尋包:
在unix/linux中,使用sudo vim /etc/profile
開啟系統profile檔案,並追加以下內容設定gopath
環境變數,同時設定go111module
為關閉狀態,go111module
環境變數我們在文章中後面部分說明
export gopath=/users/pan/go # 把自己的golang專案目錄作為gopath的變數
export go111module=off # 關閉golang 11.1 版本以後的模組功能
(1)main包與包的引入
a. 引入系統包
我們可以通過package
關鍵字定義乙個包,使用import
引入其他包,如果需要引入多個包,可以將各個包宣告在括號內
package main
import (
// 引入系統的包
"fmt"
)func main()
在以上**中,我們通過main
關鍵字定義了main包,主函式main必須位於main包下。程式中引入了fmt
包,該包由golang本身提供。
b. 引入自定義包
我們在gopath/src目錄下建立兩個檔案:
檔案1,庫檔案位於jkdev.cn/test/mypkg/lib.go
,新增以下**
package mypkg
import "fmt"
func testfunc()
檔案2,主檔案jkdev.cn/test/main.go
,新增以下**
package main
// 引入自定義包
import "jkdev.cn/test/mypkg"
func main()
自定義的包由我們自己定義,但要注意的是,乙個目錄對應乙個包,同時,包名應當和目錄名一致。引入包時,路徑相對應gopath/src,我們可以根據自己的程式的功能模組劃分不同的包。
(2)包的作用域golang中go build
命令主要用於編譯**。在包的編譯過程中,若有必要,會同時編譯與之相關聯的包。
假設我們的設定gopath是/users/pan/go
,我們在gopath之下的src建立建立**test目錄,並新增lib.go
和main.go
兩個檔案:
此時,原始檔相對於gopath的路徑如下。接下來我們對這兩個go原始檔進行編譯
go gopath目錄
├─src 原始碼目錄
│ ├─test 專案目錄
│ ├─lib.go 公共函式檔案
│ └─main.go 主函式檔案
lib.go **如下:
package main
import "fmt"
func testfunc()
main.go**如下:
package main
func main()
示例中的兩個原始檔都屬於無引數編譯不依賴main
包,所以在main.go檔案中能正常引入lib.go
檔案。
gopath
,需要在原始碼目錄下進行編譯
# 進入原始碼目錄
cd ~/go/src/test
# 編譯**
go build
我們還可以-o
指定編譯後輸出的可執行檔案的檔名,如下
go build -o main
使用「go build+檔案列表」編譯時,檔案列表中的每個檔案必須是同乙個包的 go 原始碼
# 進入原始碼目錄
cd ~/go/src/test
# 編譯
go build lib.go main.go
包的路徑相對於gopath
,「go build+包」編譯時,原始檔需要存放在gopath/src
下的路徑,但是我們可以在任意有讀寫許可權的目錄執行編譯命令,如下
# test 相對於gopath/src
go build test
與go build
具有相似功能的是go install
命令,go install
用來生成庫和工具並存放於gopath中。一是編譯包檔案(無main包),將編譯後的包檔案放到 pkg 目錄下(gopath/pkg)。二是編譯生成可執行檔案(有main包),將可執行檔案放到 bin 目錄(gopath/bin)。
golang在1.11版本引入和go modules,我們還可以叫做go模組,模組依賴於上文提到的go111module
環境變數。它是golang官方提供的包管理工具,通過go modules,我們可以不必將專案放在gopath上。
用環境變數go111module設定開啟或者關閉模組支援,它有三個可選值:off、on、auto,預設是auto。
使用go modules時,我們先將go111module
設定為on或者auto,go modules和gopath不同,不需要包含固定的三個字目錄。乙個空的源**目錄,只要初始化好go.mod
檔案,就可以定義乙個module。我們可以使用以下命令建立乙個新的module
# 建立乙個空的工作目錄
mkdir -p ~/work/go/test
# 進入工作目錄
cd ~/work/go/test
# 初始化乙個module
go mod init testmodule
我們可以看到自動生成的go.mod
檔案的內容如下
module testmodule
go 1.16
go modules會為我們進行包管理,並自動更新go.mod檔案,如果需要引入新的依賴,我們只需要在終端執行go get 包名
即可引入第三方包,如
)(2)更新依賴關係
使用go mod tidy
更新依賴關係,該命令拉取缺少的模組,移除不用的模組。go modules可以輕易地進行乙個包的依賴管理和版本控制,go build
和go install
將自動使用go.mod中的依賴關係,減少了gopath管理時的複雜性。
go語言中閉包
閉包 closure 在一些語言中,在函式中可以 巢狀 定義另乙個函式時,如果內部的函式引用了外部的函式的變數,則可能產生閉包。閉包可以用來在乙個函式與一組 私有 變數之間建立關聯關係。在給定函式被多次呼叫的過程中,這些私有變數能夠保持其永續性。golang的閉包 函式在golang中是 一等公民 ...
GO語言中的閉包
package main import fmt import fmt func main r res fmt.println r 1 r2 res fmt.println r2 2 r3 res fmt.println r3 3 乙個外層函式中有內層函式,該內層函式中,會操作外層函式的區域性變數 外...
GO語言中的strconv包
在go語言中經常用到字串和其它型別進行轉換,strconv包能實現這個功能。有兩種方法,可以使用func atoi s string i int,err error atoi代表ascii to integer。還可以使用func parseint s string,base int,bitsize...