1. 程式人生 > 其它 >go語言生成自定義uuid_由淺入深:一個簡單的例子,讓你吃透Go語言自定義的包管理...

go語言生成自定義uuid_由淺入深:一個簡單的例子,讓你吃透Go語言自定義的包管理...

技術標籤:go語言生成自定義uuid

前言

首先使用hello world,演示Go的包是如何匯入的。

package mainimport "fmt"func main() {fmt.Println("Hello, world")}

其中 “fmt” 就是就是Go內建的一個包,包含與格式化和輸出到螢幕相關的各種功能。

包的好處

使用這種方式匯入包,有以下3個好處:

  1. 降低函式方法重名的可能,讓函式保持簡短和簡潔。
  2. 有效地組織程式碼,很方便導向到標的。
  3. 只需重新編譯小的程式塊,從而加快編譯速度。例如包fmt,我們不必在每次更改程式時都重新編譯它。

程式碼演示

對於包,僅在單獨程式內的上下文中才有意義,下面做一個示例。本文下述指令,均在windows平臺下。

1 - 建立目錄

md go_mod_demo

2 - 進入目錄,並建立包名

go mod init demo.com/pkg/v1

執行後輸出如下

go: creating new go.mod: module demo.com/pkg/v1

這時,目錄下會多出一個 go.mod 檔案,內容如下:

module demo.com/pkg/v1go 1.13

僅設定了包名,和go版本號。

3 - 建立一個包

首先,新建目錄

md math

在該目錄下新建檔案 math.go ,程式碼如下

package mathfunc Average(nums []float64) float64 {total := float64(0)for _, x := range nums {total += x}return total / float64(len(nums))}

聲明瞭表明為 math,並聲明瞭一個求64位浮點數陣列的平均值的函式。

4 - 安裝math包

建立完之後,需要安裝這個包,提供外部呼叫。使用以下指令

go install

5 - 建立主程式檔案 main.go 並使用 math 包內函式

程式碼如下:

package mainimport ("fmt""demo.com/pkg/v1/math")func main() {nums := []float64{4.62, 90.31, 18.4, 70, 498}avg := math.Average(nums)fmt.Println(avg)}

可以看到,我們匯入包的名字為 “demo.com/pkg/v1/math” ,注意math是路徑名,而非包名。

6 - 檢查依賴關係並編譯

go mod verifygo build -o pkg.exe

編譯完成後生成二進位制檔案 pkg.exe。執行該檔案輸出內容如下:

136.26600000000002

7 - 目錄樹

以上步驟我們就完成了這個小的示例,下圖是所有檔案的目錄樹。

b3769a0331e1a7a91e650282b2e1812f.png

深入瞭解編譯過程

對於上述的編譯過程,深入瞭解有助於我們理解go在包管理和連線上的運用次序。在編譯階段使用以下指令

go build -x -o pkg.exe

會打印出所有編譯設計的步驟。我們逐一分析一下。

WORK=C:甥敳獲ADMINI~1AppDataLocalTempgo-build011247454mkdir -p $WORKb001

進入系統臨時目錄,並建立新的目錄用於操作。

cat >$WORKb001importcfg.link << 'EOF' # internalpackagefile demo.com/pkg/v1=C:甥敳獲AdministratorAppDataLocalgo-build7d7dfb70c94793423aa27096ae5d468f117ab2bdfd36637f56a335e015c7f422f2-dpackagefile demo.com/pkg/v1/math=C:甥敳獲AdministratorAppDataLocalgo-build9a9a761d7803a2508d3bb14baf93c9bb63d690a2d2b96dcee9e2798266bf1a8c27-dpackagefile fmt=c:gopkgwindows_amd64fmt.a……(此處省去若干行)packagefile internal/race=c:gopkgwindows_amd64internalace.apackagefile internal/syscall/windows/sysdll=c:gopkgwindows_amd64internalsyscallwindowssysdll.apackagefile internal/syscall/windows/registry=c:gopkgwindows_amd64internalsyscallwindowsegistry.aEOF

這一步建立臨時連線檔案 importcfg.link,並寫入內容。使用了為數較多的編譯後文件。

mkdir -p $WORKb001execd ."c:gopkgoolwindows_amd64link.exe" -o "C:甥敳獲ADMINI~1AppDataLocalTempgo-build011247454b001exea.out.exe" -importcfg "C:甥敳獲ADMINI~1AppDataLocalTempgo-build011247454b001importcfg.link" -buildmode=exe -buildid=DI8V_Sm875LZ1CJe7Zp_/CjatiizQFDsD0wV9omHU/TXwkAnBjuzYJjfIEu300/DI8V_Sm875LZ1CJe7Zp_ -extld=gcc "C:甥敳獲AdministratorAppDataLocalgo-build7d7dfb70c94793423aa27096ae5d468f117ab2bdfd36637f56a335e015c7f422f2-d""c:gopkgoolwindows_amd64buildid.exe" -w "C:甥敳獲ADMINI~1AppDataLocalTempgo-build011247454b001exea.out.exe" # internal

這一步建立新目錄exe,並在該目錄下呼叫 link.exe 檔案,使用上一步生成的 importcfg.link 內容。

之後呼叫 buildid.exe 檔案編譯生成目標二進位制檔案 a.out.exe。

cp $WORKb001exea.out.exe pkg.exerm -r $WORKb001

這一步將生成的二進位制檔案重新命名拷貝到目標目錄,並清空編譯臨時目錄。

結語

本文通過一個簡單的程式碼示例,逐步編寫程式碼,並將程式碼編譯為二進位制檔案,涉及到了go在包管理和編譯過程中的方方面面。

“不積跬步無以至千里”,大的專案構建,結構複雜,功能繁多,更需要清楚go在包管理中的原理,可以避免走彎路。

Happy coding :-)

【本文由 @程式設計師小助手 釋出,持續分享程式設計與程式設計師成長相關的內容,歡迎關注】