go語言中包的使用

2022-09-09 14:39:28 字數 4191 閱讀 3170

在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.gomain.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 buildgo 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...