天天看點

go get 的不再src目錄中_Go語言實戰打包和工具鍊

包的設計理念:使用包來封裝不同語義單元的功能,更好的複用代碼。

1. 包名的命名最好與所處檔案夾保持一緻

http 檔案夾下的所有 .go 檔案的包名都為 http, 聲明如:package http
           

2. 檔案夾命名最好為全小寫,如: httputil

3. 不同檔案夾下的包名可以相同,因為導入包時,是以全路徑的方式導入的(本地包或遠端包,go内置包隻需引入包名即可)

一般情況下,包被導入之後會使用預設的包名作為名字

// 導入 http 包import "net/http"// 使用http.Get()
           

但是同時導入相同的包名時,為了避免包名沖突,可以重命名包名

// format包名沖突,查找 convert 包時報錯:fmt redeclared as imported package nameimport (   "fmt"   "demo/fmt" ) // 解決:重命名 import (   "fmt"   demoFmt "demo/fmt" )
           

4. 因為 go 為了防止未被使用的包,避免代碼變得臃腫,導入包之後不使用,這是不允許的,編譯器會報錯

import "fmt" // 但沒有使用 fmt 報錯:imported and not used: "fmt"
           

但是如果想讓編譯器不報錯,可以在導入包路徑的前面使用'空白辨別符'下劃線_ 來給包賦予一個空名字,

import _ "fmt"
           

空白辨別符也可以使用的函數傳回中,來忽略你不需使用的值

func main() {  _, val := deSomething()}
           

5. 導入多個包時,一般是将 import 語句包裝在一個導入塊中

 import (      "fmt"      "strings"  )
           

6. 導入遠端包:import "遠端位址"

// 導入viper遠端包import "github.com/spf13/viper" 
           

遠端包沒有找到時,可以使用 go get "包路徑" 來下載下傳包,go get 會遞歸下載下傳所有能找到的依賴包

// 終端中執行以下代碼,即可将viper下載下傳到本地,一般會下載下傳到 $GOPATH中go get "github.com/spf13/viper"
           

7. 導入本地自己寫的包:import "包所在項目中的絕對路徑",

// import "項目檔案夾/fmt" 表示導入項目中的 fmt 包import "demo/fmt"
           

注意:如果不是使用第三插件比如 vendor 來管理包時,

項目檔案一定要放在 $GOPATH 的 src 檔案夾中(可以運作 go env 檢視 $GOPATH),

否則會導緻無法導入本地包的問題

8. go 編譯器查找包的順序:先在 $GOROOT 中查找,然後在 $GOPATH 中找,如果找到就會停止往下找,如果都找不到,則報錯。

// 沒有使用 go module等管理包工具,go-demo項目沒有放在 $GOPATH/src 下時import "go-demo/fmt"// 報錯資訊cannot find package "go-demo/fmt" in any of:usr/local/go/src/go-demo/fmt (from $GOROOT)Users/Edward/go/src/go-demo/fmt (from $GOPATH)
           

9. 使用go module 來管理依賴包,此時項目可以不用放在 $GOPATH/src 路徑下

// 使用 go module管理包// 初始化項目 demogo mod init demo// mod 導入本地包import "demo/fmt"// mod 管理遠端包// 此時會将所有的第三方依賴包都下載下傳到項目的 vendor 檔案夾中go mod vendor
           

10. 每一個包都可以有任意多個 init 函數(一個包中的多個 .go 檔案中都有 init 函數的情況)

//而這些 init 函數都會在 main 函數之前執行,是以可以在 init 函數中做一些設定包,或者初始化變量等工作

// fmt.gopackage fmtimport (   "fmt")func init() {   fmt.Println("本地 fmt 包的 init 函數")}// util.gopackage utilimport "fmt"func init() {   fmt.Println("util包的 init 函數")}// main.goimport (   "fmt"   _"go-demo/fmt"   _"go-demo/util")
           

11. main 函數是一個程式的主入口,運作 go build 之後,go 編譯器會首先查找 main 包中的 main 函數。

// 嘗試運作沒有 main 函數的 .go 檔案function main is undeclared in the main package// 如果找到,會編譯成一個可執行檔案,例如:windows會編譯成一個 .exe 檔案
           

12. 在指令行中使用 go 指令

// go 指令// 指令行是輸入 go, 回車,會看到 go 所支援的指令清單
           
go get 的不再src目錄中_Go語言實戰打包和工具鍊
// 檢視 go 環境相關資訊, 如 GOROOT, GOPATH go env
           
go get 的不再src目錄中_Go語言實戰打包和工具鍊
// 編譯檔案, 編譯成功後,會生成一個可執行檔案go build main.go// 編譯并執行檔案// 嘗試運作非main.go 檔案會報錯:cannot run non-main packagego run main.go// 清理 go build 生成的檔案go clean// go doc 包名,檢視相關包的文檔go doc fmt// godoc -http=:6060 使用 godoc 開啟一個web服務來檢視文檔// 但是,godoc 在1.13版本的時候被移除了,// 如果需要使用 godoc 指令,需要自己手動安裝// 安裝 godocgo get golang.org/x/tools/cmd/godoc// 檢視 go 版本go version
           

go vet 審查常見的代碼錯誤,每次對代碼先執行 go vet 然後在将其簽入到源代碼庫是一個很好的習慣。

fmt.Printf("main 函數", 3.14)
           
go get 的不再src目錄中_Go語言實戰打包和工具鍊

go fmt 格式化代碼成和go源碼類似的風格, 在送出代碼到代碼之前執行 go fmt 也是一個很好的習慣

// 格式化代碼成和go源碼類似的風格go fmt // 之前 if err != nil {return err}  // 之後 if err != nil {   return err }
           

大部分go 工具的指令都會接受一個包名作為參數,如果不包含檔案名時,go工具會預設使用目前目錄來編譯

13. 注釋

// 單行注釋/**多行注釋多行注釋*/// 生成文檔注釋,包名路徑下,包含一個 doc.go 的檔案,// 并把注釋加在包名聲明之前/*這是一個文檔注釋*/import myfmt
           

繼續閱讀