Go語言程序設(shè)計及實例 課件 第5章 源代碼組織與管理_第1頁
Go語言程序設(shè)計及實例 課件 第5章 源代碼組織與管理_第2頁
Go語言程序設(shè)計及實例 課件 第5章 源代碼組織與管理_第3頁
Go語言程序設(shè)計及實例 課件 第5章 源代碼組織與管理_第4頁
Go語言程序設(shè)計及實例 課件 第5章 源代碼組織與管理_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第5章

源代碼組織與管理Go語言的包01包的概念包的概念Go語言的包采用目錄樹的組織形式,一般包的名稱就是其源文件所在的目錄名,雖然Go并不強制包名必須與其所在的目錄同名,但還是建議讀者在開發(fā)項目時取相同的名字,這樣可使項目結(jié)構(gòu)更清晰。此外,在給包取名時還應(yīng)遵守下面兩個習(xí)慣:(1)包名一般全是小寫,并盡可能地用一個有意義的簡短命名。(2)實際工作中,包一般放到公司的域名目錄下,這樣既能保證包名的唯一性,又便于代碼共享,比如一家名為easybooks公司所開發(fā)項目的包一般放到“src\\項目名”目錄下。02包的工作目錄1.Go環(huán)境變量2.目錄結(jié)構(gòu)包的工作目錄1.Go環(huán)境變量在Go編程環(huán)境中,包的工作目錄與幾個重要的環(huán)境變量息息相關(guān),先介紹一下。(1)$GOROOT這是Go語言安裝的根目錄。在Windows下安裝包會自動設(shè)置,默認(rèn)是C:\ProgramFiles\Go,如果不是安裝在這個默認(rèn)目錄,則必須顯式地設(shè)置$GOROOT環(huán)境變量。(2)$GOPATH這是Go程序開發(fā)的工作目錄,類似于Java語言的工作區(qū)(Workspace)。Windows下默認(rèn)是C:\Users\<用戶名>\go,其中“用戶名”為操作系統(tǒng)當(dāng)前的登錄用戶名。(3)$GOBIN這是帶有main函數(shù)的源程序執(zhí)行g(shù)oinstall命令時生成的可執(zhí)行程序安裝目錄,默認(rèn)是$GOPATH\bin。如果想在任何路徑執(zhí)行安裝的程序,可以將$GOBIN添加到Windows系統(tǒng)環(huán)境變量Path中。包的工作目錄(4)$GOOS與$GOARCH$GOOS用來設(shè)置目標(biāo)操作系統(tǒng),$GOARCH用來設(shè)置目標(biāo)平臺的CPU體系結(jié)構(gòu)。這兩個變量主要用在Go程序跨平臺的交叉編譯中,一般不用設(shè)置。以管理員身份打開Windows命令行,用goenv命令可查看Go編程環(huán)境當(dāng)前各變量的值,如圖。包的工作目錄2.目錄結(jié)構(gòu)$GOPATH環(huán)境變量所指定的目錄就是Go程序包默認(rèn)的工作目錄。在用傳統(tǒng)方式開發(fā)Go項目時,會在工作目錄下創(chuàng)建3個子目錄,如圖。包的工作目錄(1)src目錄包含了組成各種包的源代碼。通常在src下的第一層是根目錄(一般是公司域名),根目錄下才是各個項目的目錄,項目目錄下可以是其源代碼文件及各種包,這是一種推薦的代碼組織結(jié)構(gòu),例如:$GOPATH\src\\grpc其中,“$GOPATH\src\”就是根目錄,“grpc”則是具體的項目目錄,而grpc內(nèi)則是該項目的源代碼文件和包。(2)pkg目錄用于存放各包編譯生成的類庫。(3)bin目錄用于存放包編譯或安裝后生成的可執(zhí)行(.exe)文件。其中,src目錄必須由用戶自己建立用于包含所有的源代碼,這是Go的強制規(guī)定,而另兩個(pkg和bin)目錄則無須手動創(chuàng)建,必要時Go命令行工具在構(gòu)建項目的過程中會自動創(chuàng)建它們。03包的使用1.導(dǎo)入包2.引用路徑3.包的加載4.包的作用域包的使用1.導(dǎo)入包用import語句導(dǎo)入包,有4種引用方式,這里以Go的fmt標(biāo)準(zhǔn)庫(包)為例說明如下。(1)標(biāo)準(zhǔn)方式import"fmt"這是最常用的一種方式,導(dǎo)入后可以用“fmt.”作為前綴引用包內(nèi)的可導(dǎo)出元素,如:fmt.Println("Hello,我愛Go語言!@easybooks")(2)別名方式importsay"fmt"相當(dāng)于給包fmt起了個別名say,用“say.”代替標(biāo)準(zhǔn)的“fmt.”作為前綴引用包內(nèi)元素,語句寫成:say.Println("Hello,我愛Go語言!@easybooks")(3)省略方式import."fmt"這相當(dāng)于把包fmt的命名空間與當(dāng)前程序的命名空間直接合并,合并后就可不用前綴直接引用fmt包內(nèi)元素,簡寫成:Println("Hello,我愛Go語言!@easybooks")包的使用(4)僅執(zhí)行包初始化函數(shù)當(dāng)使用標(biāo)準(zhǔn)方式導(dǎo)入了包但是代碼中卻沒有使用此包,編譯器會報錯,可改用“import_"包名"”這種方式導(dǎo)入包,它僅執(zhí)行包的init初始化函數(shù),即使包沒有初始化函數(shù)也不會引發(fā)編譯器報錯,如:packagemainimport_"fmt"funcmain(){ //無代碼}包的使用2.引用路徑Go語言所有內(nèi)置標(biāo)準(zhǔn)包的源碼都位于$GOROOT\src下,可以直接引用。而自定義或第三方包的源碼則必須放到$GOPATH\src目錄下才能被引用。引用一個包可以用全路徑或相對路徑,寫法如下。(1)全路徑全路徑就是包的根路徑($GOROOT\src或$GOPATH\src)后面包源碼的完整路徑,例如,下面這幾個包的引用路徑:import"/MyBmi/bmi"import"/grpc/peer"import"database/sql/driver"其中,bmi是自定義的包,其源碼保存在$GOPATH\src\\MyBmi\bmi目錄下;peer是第三方(谷歌開發(fā)的gRPC框架)的包,從網(wǎng)絡(luò)下載的源碼位于$GOPATH\src\\grpc\peer下;driver是Go語言內(nèi)置的包,源碼在$GOROOT\src\database\sql\driver下。(2)相對路徑比如有兩個包:包a的路徑是$GOPATH\src\\a,包b的路徑是$GOPATH\src\\b,現(xiàn)假設(shè)b要引用a包,則可以使用相對路徑引用方式,如下:import"../a"相對路徑只能用于引用$GOPATH下的包,而標(biāo)準(zhǔn)包的引用只能使用全路徑。包的使用3.包的加載程序啟動時,在執(zhí)行入口(main)函數(shù)之前,Go的引導(dǎo)程序會先對整個程序中的包進(jìn)行初始化并逐個加載包,流程如下。(1)引導(dǎo)程序從入口函數(shù)導(dǎo)入的包開始,逐級查找包的引用,直到找到?jīng)]有引用其他包的包,最終生成一個包引用的有向無環(huán)圖。(2)然后,編譯器將有向無環(huán)圖轉(zhuǎn)換為一棵樹,從樹的葉子節(jié)點開始逐層向上對包進(jìn)行初始化。(3)對單個包,先初始化其常量,然后是全局變量,最后才執(zhí)行包的init函數(shù)(如果有)。一個包可以有多個init函數(shù),初始化時會執(zhí)行全部的init函數(shù),但并不能保證執(zhí)行順序,所以不建議在一個包中放入多個init函數(shù),而是將需要初始化的邏輯寫在一個init函數(shù)里。包的使用4.包的作用域作用域(scope)是指程序代碼中標(biāo)識符的名字與實例(內(nèi)存地址)的綁定保持對應(yīng)有效的邏輯區(qū)間,簡言之,就是在多大的范圍內(nèi)可見(能夠訪問)這個標(biāo)識符。Go語言是靜態(tài)作用域語言,其標(biāo)識符的可見范圍不依賴程序運行時的因素,在編譯期就能完全確定。Go語言用命名空間(Namespace)來表示標(biāo)識符的可見范圍,一個標(biāo)識符可在多個命名空間中定義,它在不同命名空間中的含義是互不相干的。這意味著在一個新的命名空間中可定義任意名字的標(biāo)識符,而不會與其他命名空間的同名標(biāo)識符發(fā)生沖突。包名構(gòu)成了Go命名空間的一部分,不同的包可看作是一個獨立的命名空間,因此在不同包內(nèi)可以聲明相同的標(biāo)識符。Go語言包內(nèi)以大寫字母開頭的標(biāo)識符(包括變量、常量、函數(shù)和方法名、自定義類型、類的屬性等),它們具有全局作用域,在任意命名空間內(nèi)都可見;而包內(nèi)定義的以小寫字母開頭的標(biāo)識符卻僅在本包可見,在其他包都是不可見的,這些標(biāo)識符只具有包內(nèi)作用域。包的使用【實例5.1】主程序訪問同一包內(nèi)的另一源文件。在$GOPATH\src(筆者的為C:\Users\Administrator\go\src)下建立根目錄“”,其下再建一個項目目錄“MyBmi”。然后用Windows記事本在項目目錄中創(chuàng)建兩個Go源文件:human.go與main.go。(1)human.go中定義Human類及其屬性和方法(首字母全為小寫),代碼。(2)main.go作為主程序使用Human類,代碼如下:packagemainimport"fmt"funcmain(){ man:=Human{} man.setName("周何駿") man.setHeight(1.73) man.setWeight(60) man.setAge(19) fmt.Println(man.getName(),"BMI指數(shù)是",man.bmiCal())}包的使用(3)運行以管理員身份打開Windows命令行,先后執(zhí)行如下命令:cdC:\Users\Administrator\go\src\\MyBmigorunmain.gohuman.go運行過程如圖。包的使用【實例5.2】主程序訪問不同包下的另一源文件。(1)在上例所建的項目目錄MyBmi下新建一個目錄bmi作為包,將源文件human.go放到包中,代碼改為。(2)將主程序main.go的代碼寫成如下:packagemainimport( "fmt" "/MyBmi/bmi" //全路徑引用包)funcmain(){ man:=bmi.Human{} man.Name="周何駿" //直接訪問Name屬性 man.SetHeight(1.73) man.SetWeight(60) man.SetAge(19) fmt.Println(man.Name,"BMI指數(shù)是",man.BmiCal())}包的使用(3)運行在Windows命令行下執(zhí)行:cdC:\Users\Administrator\go\src\\MyBmigorunmain.go運行過程如圖。包的使用若將main.go中的語句“man.SetHeight(1.73)”改成“man.height=1.73”,由于height(身高)屬性首字母是小寫,包外部的程序無法直接訪問,運行出錯,如圖。第5章

源代碼組織與管理第三方包01安裝第三方包1.獲取安裝2.編譯安裝安裝第三方包1.獲取安裝使用goget命令可以通過網(wǎng)絡(luò)遠(yuǎn)程獲取(或更新)第三方包及其依賴包,自動完成編譯和安裝,命令格式為:goget-參數(shù)帶全路徑的包名這里的“全路徑”指的是包的完整網(wǎng)絡(luò)訪問路徑,goget命令據(jù)此動態(tài)獲取遠(yuǎn)程代碼托管平臺倉庫中的包,目前支持的主要托管平臺有Github、Gitee(碼云)等。例如:goget-u/golang/protobuf/protoc-gen-go這個命令會自動到Github上去獲取一個名為protoc-gen-go的插件,-u參數(shù)表示讓命令通過網(wǎng)絡(luò)來動態(tài)地更新已有的包及其依賴包,一般都要帶這個參數(shù),除此之外,goget命令還有一些其他參數(shù),功能見表。參

數(shù)功

述-d只下載包而不安裝-f忽略對已下載包導(dǎo)入路徑的檢查-fix在下載包后先進(jìn)行修正,然后再編譯和安裝-insecure允許使用非安全通道(如HTTP而非HTTPS)去下載包-t同時下載并安裝指定包測試文件中的依賴包安裝第三方包2.編譯安裝有時候,所需的第三方包沒有現(xiàn)成的可安裝版本,可先下載其源代碼,然后再編譯安裝。1)下載源代碼下載源代碼需要借助與遠(yuǎn)程包相匹配的代碼管理工具,如Git、SVN、HG等,下面以Git為例介紹基本的操作方法。(1)安裝Git訪問/downloads,下載Git,得到可執(zhí)行文件Git-2.41.0-64-bit.exe,雙擊啟動安裝向?qū)В鐖D。安裝第三方包(2)啟動GitBash安裝Git后可在開始菜單左上的“最近添加”中看到3個啟動圖標(biāo),如圖。安裝第三方包其中,第3個“GitBash”是Git配套的控制臺,下載源代碼的命令就通過它來執(zhí)行,雙擊啟動控制臺,出現(xiàn)窗口如圖5.8所示,在“$”提示符后輸入命令。安裝第三方包(3)克隆下載使用gitclone命令以“克隆”方式下載源代碼,該命令可以復(fù)制遠(yuǎn)程倉庫的所有代碼和歷史記錄,并在本地創(chuàng)建一個與遠(yuǎn)程倉庫完全相同的倉庫的副本。通常將遠(yuǎn)程倉庫中包(及其依賴組件)的源碼克隆到本地的$GOPATH\src目錄下,命令格式為:gitclonehttps://遠(yuǎn)程倉庫路徑/文件名.git$GOPATH/src/本地路徑其中,“本地路徑”是下載到本地的包的源代碼存放路徑,不一定要與遠(yuǎn)程倉庫路徑相同。例如:gitclone/grpc/grpc-go.git$GOPATH/src//grpc將Github遠(yuǎn)程倉庫中g(shù)rpc-go包的源代碼下載到本地$GOPATH\src目錄中的\grpc路徑下,Git會自動創(chuàng)建存放源碼路徑上的各級文件夾目錄。2)編譯安裝有了源代碼,就可以將其編譯成可運行的包并安裝到Go環(huán)境中,使用goinstall命令進(jìn)行編譯安裝。首先由GitBash控制臺進(jìn)入到$GOPATH\src目錄,執(zhí)行命令:cd$GOPATH/src/然后執(zhí)行g(shù)oinstall命令,格式為:goinstall本地路徑(即源代碼存放路徑)@latest最后加“@latest”是為了將安裝的包與其在網(wǎng)絡(luò)上能夠找到的最新版本同步。02包的管理1.包管理概述2.gomodule工具包的管理1.包管理概述1)vendor機制在很長一段時間內(nèi),Go官方并沒有第三方包管理的解決方案,直到Go1.5引入了vendor機制,才為Go外部包的管理提供了有限的支持。該機制是在當(dāng)前包中引入一個vendor目錄,將該包所依賴的外部包復(fù)制到這個目錄下,編譯器在查找所需的第三方包時,也優(yōu)先在該目錄下找,流程如下。(1)如果當(dāng)前包下有vendor目錄,先從其下查找第三方的包,若找到就使用;若沒找到或者當(dāng)前包下根本就沒有vendor目錄,繼續(xù)第(2)步。(2)沿當(dāng)前包目錄向上逐級查找直到$GOPATH\src,其間只要發(fā)現(xiàn)一個vendor目錄就去里面查找,使用找到的第一個符合要求的包。(3)到$GOPATH下查找。(4)最終去到$GOROOT下查找。包的管理2)版本管理如果第三方包更新了,新版本與舊版本又不兼容怎么辦?廣大Go程序員迫切需要對第三方包進(jìn)行更精細(xì)的管理,尤其對包的版本做精確的管控。起初,在Go社區(qū)出現(xiàn)了很多包管理工具,如godep、govendor、glide等,但是由于不同管理工具采用的是不同的元信息格式(如godep用Godeps.json、glide用glide.yaml),不利于社區(qū)發(fā)展,也嚴(yán)重違背了Go語言所追求的開箱即用、簡單快速的設(shè)計理念。為了避免語言和工具的分裂,維護(hù)Go的設(shè)計理念,官方先是提供了一個叫作dep的工具,但并未馬上集成到Go工具鏈,Go核心團(tuán)隊通過它來吸取實際使用經(jīng)驗并收集社區(qū)的反饋,不斷實驗、探索如何有效管理包版本,在此基礎(chǔ)上終于開發(fā)出一個統(tǒng)一、強大的包管理工具gomodule,并于2019年9月3日發(fā)布的Go1.13中開始正式支持。包的管理2.gomodule工具gomodule以“模塊(Module)”為基本單元來管理包,一個任意名稱的目錄(包括空目錄)都可以作為模塊,只要其中包含go.mod文件。通常開發(fā)中將項目整體作為一個模塊,程序中引用包都是基于當(dāng)前模塊(項目)的相對路徑,簡化了編程。使用gomodule管理一個項目包的步驟如下。(1)將Go的環(huán)境變量GO111MODULE設(shè)置為on,開啟gomodule功能。(2)創(chuàng)建模塊通過以下命令創(chuàng)建一個新的模塊:gomodinit模塊名創(chuàng)建后會在當(dāng)前包目錄下生成一個go.mod文件,內(nèi)容為:module模塊名go1.xx包的管理(3)管理第三方包有了go.mod文件后,項目開發(fā)過程中g(shù)omodule就會自動地為用戶進(jìn)行包管理,如果用戶想在項目中引入一個第三方包,比如要使用當(dāng)前流行的Go-kit框架(用于微服務(wù)開發(fā)),就可以在go.mod文件中添加一句:require/go-kit/kitv0.12.0用require關(guān)鍵字引入該框架的0.12.0版本,然后就可以通過執(zhí)行以下命令來手動下載這個框架及其依賴的所有第三方包:gomoddownload用戶可以通過執(zhí)行g(shù)omodvendor命令生成vendor目錄,在其中集中放置go.mod文件描述的所有第三方包,還可以使用gomodtidy命令更新依賴關(guān)系,拉取缺少的包和移除不用的包。包的管理【實例5.3】將【實例5.2】的項目納入gomodule管理。操作步驟如下。(1)在本地計算機的任一位置(如筆者是在C:\Users\Administrator)新建一個文件夾,其中創(chuàng)建項目目錄MyBmi。(2)以管理員身份打開Windows命令行,執(zhí)行如下命令打開gomodule功能:goenv-wGO111MODULE=on可運行g(shù)oenv命令查看是否開啟成功,如圖。包的管理(3)將【實例5.2】項目MyBmi中的bmi包目錄(內(nèi)含human.go)及主程序main.go一起復(fù)制到本例項目目錄MyBmi中,然后通過命令行進(jìn)入其中執(zhí)行創(chuàng)建模塊的命令:cdC:\Users\Administrator\\MyBmigomodinitMyBmi過程如圖。包的管理命令執(zhí)行后在MyBmi目錄中可見已經(jīng)生成了go.mod文件,如圖。用Windows記事本打開go.mod文件,可見其內(nèi)容如下:moduleMyBmigo1.20這表示gomodule已將MyBmi項目視為一個模塊加以管理了。包的管理(4)啟動GoLand,選擇“File”→“Open...”,彈出“OpenFileorProject”對話框,展開目錄樹進(jìn)入到C:\Users\Administrator下的文件夾,選中MyBmi目錄,單擊“OK”按鈕,如圖,可在GoLand集成開發(fā)環(huán)境中打開此項目。包的管理(5)打開main.go,將導(dǎo)入bmi包的路徑由全路徑改為模塊相對路徑,如下:packagemainimport( "MyBmi/bmi" //用模塊相對路徑引用包 "fmt")funcmain(){ ...//主程序代碼,略。}(6)用GoLand運行main.go,結(jié)果如圖。包的管理事實上,GoLand就是通過gomodule工具來管理其Go項目的,在用戶創(chuàng)建項目的時候就會自動在所建的項目目錄中生成go.mod文件,大家可以打開之前用GoLand創(chuàng)建的項目自己去看一下,也只有包含go.mod文件的目錄才會被GoLand識別為是一個Go項目,故本例若沒有事先用gomodinit命令生成go.mod文件,而試圖直接用GoLand打開項目目錄就會出現(xiàn)如圖所示的錯誤。第5章

源代碼組織與管理Go語言與C語言Go語言與C語言在Go語言工具包中有一個Cgo命令,專用來處理Go調(diào)用C相關(guān)的操作,用戶可以直接使用該命令,也可以在運行或構(gòu)建Go程序時自動調(diào)用它。Cgo對于C代碼的處理要依賴系統(tǒng)中C語言相關(guān)的編譯工具,如gcc,在Go環(huán)境變量中默認(rèn)已開啟了對Cgo的支持,如圖。Go語言與C語言【實例5.4】用Go語言調(diào)用C代碼實現(xiàn)圓面積和周長的計算。(1)編寫C代碼在GoLand的默認(rèn)項目awesomeProject目錄下用Windows記事本創(chuàng)建一個C語言源文件circle.c,代碼如下:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論