亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語言包和包管理詳解

 更新時間:2022年09月02日 10:23:59   作者:ourlang  
這篇文章主要為大家介紹了Go語言包和包管理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

1 包簡介

1.1 工作空間

go語言的工作空間必須由 bin、pkg、src三個目錄組成,可以在GOPATH環(huán)境變量中添加多個工作空間,但不能和GOROOT相同。通常go get使用第一個工作空間保存下載的第三方庫

workspace
	|
	+--- bin // go install 安裝目錄。
	|	  |
	| 	  +--- learn
	|
	|
	+--- pkg // go build ?成靜態(tài)庫 (.a) 存放目錄。
	| 	  |
	|	  +--- darwin_amd64
	| 			|
	| 			+--- mylib.a
	| 					|
	| 					+--- mylib
	|						 |
	|						 +--- sublib.a
	|
	+--- src // 項目源碼目錄。
		  |
		  +--- learn
		  | 	 |
		  | 	 +--- main.go
		  |
		  |
		  +--- mylib
				 |
				 +--- mylib.go
				 |
				 +--- sublib
						|
						+--- sublib.g

1.2 源文件

  • 編碼:源碼?件必須是 UTF-8 格式,否則會導致編譯器出錯。
  • 結(jié)束:語句以 “;” 結(jié)束,多數(shù)時候可以省略。
  • 注釋:?持 “//”、 “/**/” 兩種注釋?式,不能嵌套。
  • 命名:采? camelCasing ?格,不建議使?下劃線。

1.3 包命名

::: tip 包命名慣例

  • 給包命名的慣例是使用包所在目錄的名字。這讓用戶在導入包的時候,就能清晰地知道包名。
  • 盡量使用簡介明了的名字,但要避免沖突
  • 包名一般使用單數(shù)的形式,但是避免沖突的用的復數(shù)比如bytes,errors,strings等
  • 要避免包名有其他含義。比如 temp這種
  • 命名時考慮包名和成員如何配合,盡量減少包名和成員有重復 :::

1.4 main 包

  • 所有用 Go 語言編譯的可執(zhí)行程序都必須有一個名叫 main 的包。 go語言的編譯器會將這種名字的包編譯為二進制可執(zhí)行文件。
  • main包下肯定會有名為main()的函數(shù),main()是程序的入口。
  • 編譯完會使用聲明 main 包的代碼所在的目錄的目錄名作為二進制可執(zhí)行文件的文件名

2導包

關(guān)鍵字 Import ,進行導包。未使用的導入包,會編譯錯誤。

2.1 兩種方式

import a import b,…多次導入,以及import(a b c) 批量導入,如果導入的包不使用會報錯。

import "fmt"
//或者
import(
	"fmt"
    "time"
)

2.2 包的別名

import(
	io "fmt"
)
io.Println("hello world") //別名可以直接用,在包重名時很有用

2.3 簡潔模式

import (
	. "fmt"  //但是為了別人好看,一般還是不用這種
)
func main(){
	Println("hello")
}

2.4非導入模式(匿名導入)

即導入一個包并不使用它。如果不加_,就會出現(xiàn)編譯錯誤。 在這里用下劃線 _ 重命名導入的包。只導入,不使用。 但是這個包它進行了初始化,一般在init函數(shù)調(diào)用,這樣做的好處是,有些包我們不顯示使用它,但是有可能用到它,或者由用戶選擇使用哪個。比如 對特定圖像驅(qū)動包的初始化,在我們格式化轉(zhuǎn)換圖片用到。還有 database/sql包,可以先都初始化,讓用戶選擇不同的數(shù)據(jù)庫驅(qū)動。

import _ "test"     //非導入模式:僅讓該包執(zhí)行初始化函數(shù)

2.5 導包的路徑

一般情況下是包的相對路徑。比如import "learn/test",標準庫中的包會在安裝 Go 的位置找到,即GOROOT。 Go 開發(fā)者創(chuàng)建的包會在 GOPATH 環(huán)境變量指定的目錄里查找。GOPATH 指定的這些目錄就是開發(fā)者的個人工作空間。

2.6 遠程導入

目前的大勢所趨是,使用分布式版本控制系統(tǒng)(Distributed Version Control Systems, DVCS) 來分享代碼,如 GitHub、 Launchpad 還有 Bitbucket。 Go 語言的工具鏈本身就支持從這些網(wǎng)站及 類似網(wǎng)站獲取源代碼。 Go 工具鏈會使用導入路徑確定需要獲取的代碼在網(wǎng)絡的什么地方。

比如:import "github.com/xxxx/xxx",用導入路徑編譯程序時, go build 命令會使用 GOPATH的設(shè)置,在磁盤上搜索這個包。事實上, 這個導入路徑代表一個URL,指向 GitHub上的代碼庫。如果路徑包含 URL,可以使用 Go 工具鏈從 DVCS 獲取包,并把包的源代碼保存在GOPATH指向的路徑里與 URL 匹配的目錄里。這個獲取過程 使用 go get 命令完成。

go get 將獲取任意指定的 URL 的包,或者一個已經(jīng)導入的包所依賴的其 他包。由于 go get的這種遞歸特性,這個命令會掃描某個包的源碼樹,獲取能找到的所有依賴包。

3 初始化 init

每個包可以包含任意多個 init 函數(shù),這些函數(shù)都會在程序執(zhí)行開始的時候被調(diào)用。所有被編譯器發(fā)現(xiàn)的 init 函數(shù)都會安排在 main 函數(shù)之前執(zhí)行。 init 函數(shù)用在設(shè)置包、初始化變量或者其他要在程序運行前優(yōu)先完成的引導工作。舉例如下

 package postgres
 import (
	 "database/sql"
 )
 func init() { //初始化函數(shù)
     //這里省略。。
	 sql.Register("postgres", new(PostgresDriver))
 }

3.1 init總結(jié)

  • 每個源?件都可以定義?個或多個初始化函數(shù)。
  • 編譯器不保證多個初始化函數(shù)執(zhí)行次序。
  • 初始化函數(shù)在單?線程被調(diào)用,僅執(zhí)行?次。
  • 初始化函數(shù)在包所有全局變量初始化后執(zhí)行。
  • 在所有初始化函數(shù)結(jié)束后才執(zhí)行 main.main。
  • 無法調(diào)用初始化函數(shù)。

4 包管理

4.1 演變過程

  • 2013年:Gedep,社區(qū)第一個包管理工具
  • 2015年:vendor,Golang官方(golang1.5)
  • 2016、2017 年:dep、manul、Godep、Govendor、godm (Govendor勝出)
  • go module是Go1.11版本之后官方推出的版本管理工具,并且從Go1.13版本開始,go module將是Go語言默認的依賴管理工具。

4.2 Go Model優(yōu)點

  • 不必須將項目目錄放在GOPATH中
  • 不使用vendor目錄,而是統(tǒng)一安裝到$GOPATH/pkg/mod/cache
  • build/run時,自動析出項目import的包并安裝

4.3 啟用go module

要啟用go module支持首先要設(shè)置環(huán)境變量GO111MODULE,通過它可以開啟或關(guān)閉模塊支持,它有三個可選值:off、on、auto,默認值是auto。 設(shè)置GO111MODULE=on之后就可以使用go module了,以后就沒有必要在GOPATH中創(chuàng)建項目了,并且還能夠很好的管理項目依賴的第三方包信息。 使用 go module 管理依賴后會在項目根目錄下生成兩個文件go.modgo.sum。

  • GO111MODULE=off禁用模塊支持,編譯時會從GOPATHvendor文件夾中查找包。
  • GO111MODULE=on啟用模塊支持,編譯時會忽略GOPATHvendor文件夾,只根據(jù) go.mod下載依賴。
  • GO111MODULE=auto,當項目在$GOPATH/src外且項目根目錄有go.mod文件時,開啟模塊支持。

4.4 GOPROXY

Go1.13之后GOPROXY默認值為proxy.golang.org,在國內(nèi)是無法訪問的,所以十分建議大家設(shè)置GOPROXY

5 go mod詳解

5.1 go mod命令

常用的go mod命令如下:

go mod命令描述
go mod download下載依賴的module到本地cache(默認為$GOPATH/pkg/mod目錄)
go mod edit編輯go.mod文件
go mod graph打印模塊依賴圖
go mod init初始化當前文件夾, 創(chuàng)建go.mod文件
go mod tidy增加缺少的module,刪除無用的module
go mod vendor將依賴復制到vendor下
go mod verify校驗依賴
go mod why解釋為什么需要依賴

5.2 go.mod說明

go.mod文件記錄了項目所有的依賴信息,其結(jié)構(gòu)大致如下:

module github.com/ourlang/studygo/myblog
go 1.13
require (
	github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586
	github.com/gin-gonic/gin v1.4.0
	github.com/go-sql-driver/mysql v1.4.1
	github.com/jmoiron/sqlx v1.2.0
	github.com/satori/go.uuid v1.2.0
	google.golang.org/appengine v1.6.1 // indirect
)
  • module用來定義包名
  • require用來定義依賴包及版本
  • indirect表示間接引用

5.2.1 依賴的版本

go mod支持語義化版本號,比如go get foo@v1.2.3,也可以跟git的分支或tag,比如go get foo@master,當然也可以跟git提交哈希,比如go get foo@e3702bed2。關(guān)于依賴的版本支持以下幾種格式:

gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7
gopkg.in/vmihailenco/msgpack.v2 v2.9.1
gopkg.in/yaml.v2 <=v2.2.1
github.com/tatsushid/go-fastping v0.0.0-20160109021039-d7bb493dee3e
latest

5.2.2 replace

在國內(nèi)訪問golang.org/x的各個包都需要翻墻,你可以在go.mod中使用replace替換成github上對應的庫。

replace (
	golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
	golang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638d
	golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)

5.3 go get

::: tip 在項目中執(zhí)行g(shù)o get命令可以下載依賴包,并且還可以指定下載的版本。

  • 運行go get -u將會升級到最新的次要版本或者修訂版本(x.y.z, z是修訂版本號, y是次要版本號)
  • 運行go get -u=patch將會升級到最新的修訂版本
  • 運行go get package@version將會升級到指定的版本號version
  • 如果下載所有依賴可以使用go mod download命令。 :::

5.3.1 整理依賴

我們在代碼中刪除依賴代碼后,相關(guān)的依賴庫并不會在go.mod文件中自動移除。這種情況下我們可以使用go mod tidy命令更新go.mod中的依賴關(guān)系

5.4 go mod edit

5.4.1 格式化

因為我們可以手動修改go.mod文件,所以有些時候需要格式化該文件。Go提供了一下命令:

go mod edit -fmt

5.4.2 添加依賴項

go mod edit -require=golang.org/x/text

5.4.3 移除依賴項

如果只是想修改go.mod文件中的內(nèi)容,那么可以運行go mod edit -droprequire=package path,比如要在go.mod中移除golang.org/x/text包,可以使用如下命令

go mod edit -droprequire=golang.org/x/text

6 項目中使用go module

6.1 現(xiàn)有項目

如果需要對一個已經(jīng)存在的項目啟用go module,可以按照以下步驟操作:

  • 在項目目錄下執(zhí)行go mod init,生成一個go.mod文件。
  • 執(zhí)行go get,查找并記錄當前項目的依賴,同時生成一個go.sum記錄每個依賴庫的版本和哈希值

6.2 新項目

對于一個新創(chuàng)建的項目,我們可以在項目文件夾下按照以下步驟操作:

  • 執(zhí)行go mod init 項目名命令,在當前項目文件夾下創(chuàng)建一個go.mod文件。
  • 手動編輯go.mod中的require依賴項或執(zhí)行go get自動發(fā)現(xiàn)、維護依賴。

以上就是Go語言包和包管理詳解的詳細內(nèi)容,更多關(guān)于Go語言包及管理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言單元測試的實現(xiàn)及用例

    Go語言單元測試的實現(xiàn)及用例

    在日常開發(fā)中,我們通常需要針對現(xiàn)有的功能進行單元測試,以驗證開發(fā)的正確性,本文主要介紹了Go語言單元測試的實現(xiàn)及用例,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • 關(guān)于升級go1.18的goland問題詳解

    關(guān)于升級go1.18的goland問題詳解

    作為一個go語言程序員,覺得自己有義務為go新手開一條更簡單便捷的上手之路,下面這篇文章主要給大家介紹了關(guān)于升級go1.18的goland問題的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Go計算某段代碼運行所耗時間簡單實例

    Go計算某段代碼運行所耗時間簡單實例

    這篇文章主要給大家介紹了關(guān)于Go計算某段代碼運行所耗時間的相關(guān)資料,主要介紹了Golang記錄計算函數(shù)執(zhí)行耗時、運行時間的一個簡單方法,文中給出了詳細的代碼示例,需要的朋友可以參考下
    2023-11-11
  • Golang中的godoc使用簡介(推薦)

    Golang中的godoc使用簡介(推薦)

    Godoc是go語言的文檔化工具,類似于文檔化工具godoc,類似于Python的Docstring和Java的Javadoc,這篇文章主要介紹了Golang中的godoc使用簡介,需要的朋友可以參考下
    2022-10-10
  • golang time包下定時器的實現(xiàn)方法

    golang time包下定時器的實現(xiàn)方法

    定時器的實現(xiàn)大家應該都遇到過,最近在學習golang,所以下面這篇文章主要給大家介紹了關(guān)于golang time包下定時器的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-12-12
  • 使用Go語言實現(xiàn)在項目中隱藏敏感信息

    使用Go語言實現(xiàn)在項目中隱藏敏感信息

    在開發(fā)項目是,用戶信息管理是一個非常常見的場景,特別是當我們需要存儲和處理敏感信息時,本文主要介紹了如何使用Go語言實現(xiàn)隱藏敏感信息,需要的可以參考下
    2024-11-11
  • 在Go語言中使用JSON的方法

    在Go語言中使用JSON的方法

    這篇文章主要介紹了在Go語言中使用JSON的相關(guān)資料,需要的朋友可以參考下
    2018-02-02
  • golang復制文件夾移動到另一個文件夾實現(xiàn)方法詳解

    golang復制文件夾移動到另一個文件夾實現(xiàn)方法詳解

    這篇文章主要為大家介紹了golang復制文件夾并移動到另一個文件夾實現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • golang grpc 負載均衡的方法

    golang grpc 負載均衡的方法

    這篇文章主要介紹了golang grpc 負載均衡的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • golang的匿名函數(shù)和普通函數(shù)的區(qū)別解析

    golang的匿名函數(shù)和普通函數(shù)的區(qū)別解析

    匿名函數(shù)是不具名的函數(shù),可以在不定義函數(shù)名的情況下直接使用,通常用于函數(shù)內(nèi)部的局部作用域中,這篇文章主要介紹了golang的匿名函數(shù)和普通函數(shù)的區(qū)別,需要的朋友可以參考下
    2023-03-03

最新評論