golang快速入門(六)特有程式結構

頂級飲水機管理員發表於2021-06-02

提示:本系列文章適合對Go有持續衝動的讀者

閱前須知:在程式結構這章,更多會關注golang中特有結構,與其他語言如C、python中相似結構(命名、宣告、賦值、作用域等)不再贅述。

一、golang型別別名

在go1.9中引入型別別名的特性,其中兩個內建型別byteruneuint8int32的別名。型別別名即字面意思換個名字,兩者是相同型別。

型別宣告語句一般出現在包一級,因此如果新建立的型別名字的首字元大寫,則在包外部也可以使用。

解決問題:大規模重構期間啟用漸進式程式碼修復,特別是將型別從一個包移動到另一個包,以便引用舊名稱的程式碼與引用新名稱的程式碼互操作。型別別名對於允許使用單個頂級匯出 API 將大型包拆分為多個實現包,以及對現有包的擴充套件版本進行試驗也可能很有用。

定義方法:

type T1 = T2

提案地址:18130-type-alias


二、變數初始化

  1. 如果初始化表示式被省略,那麼將用零值初始化該變數,即如下:

int -->0

bool -->false

string-->""

介面型別:slice、指標、map、chan、函式 -->nil

陣列或結構體: 每個元素或欄位初始為對應型別零值

零值初始化機制可以確保每個宣告的變數總是有一個良好定義的值,這個特性可以減少許多額外工作
  1. 函式返回值初始化變數,比如err的獲取。在賦值語句左邊的變數和右邊最終的求到的值必須有相同的資料型別。
if err:=http.Get(addr),err{
	//
}
  1. 初始化表示式可以是字面量或任意的表示式。在包級別宣告的變數會在main入口函式執行前完成初始化,區域性變數將在宣告語句被執行到的時候完成初始化
  2. 簡短式(:=)區域性變數宣告只可用於區域性變數宣告。並且簡短變數宣告語句對這些已經宣告過的變數具有賦值行為。如下第二個宣告只宣告瞭out一個變數。
in, err := os.Open(infile)
// ...
out, err := os.Create(outfile)
  1. 函式內生命的變數必須使用,不過可以使用下劃線_ 丟棄。

三、變數生命週期

對於在包一級宣告的變數來說,它們的生命週期和整個程式的執行週期是一致的。

而相比之下,區域性變數的生命週期則是動態的:每次從建立一個新變數的宣告語句開始,直到該變數不再被引用為止,然後變數的儲存空間可能被回收。

函式的引數變數和返回值變數都是區域性變數。它們在函式每次被呼叫的時候建立。


四、golang package(包)與golang Module(模組)

1. package:對一組函式或功能的封裝,即避免重複造輪子。

在1.12之後版本(引入了module)安裝後,會在使用者目錄下建立一個 go 資料夾作為預設的 GOPATH,go get 會將遠端的軟體包下載到GOPTH目錄下 pkg/mod 裡。GOROOT為go檔案和安裝目錄。$GOROOT/src為內建標準庫。

image-20210601234257121

GOPATH目錄已下載的package

image-20210601235631316

$GOROOT/src目錄內建package

image-20210601234954917

在沒有使用 golang module 前匯入他人分享的 package 需要先使用 go get 下載到本地,然後才可以通過import引用此 package


2. module:對package進行管理,即管理應用的依賴和package版本。

引入module後專案目錄不再只限制在GOPATH/src,你可以在任意資料夾下建立你的專案,再使用go mod init初始化即可。如下初始化一個module為github.com/csgo 在當前資料夾下產生go.mod檔案。

[root@VM-0-5-centos water_man]# ls
go.mod  water_man.go
[root@VM-0-5-centos water_man]# cat go.mod 
module github.com/csgo   //檔名稱

go 1.15   //go版本

replace github.com/csgo/rush_b => ../rush_b  //重定向package到../rush_b資料夾下

require github.com/csgo/rush_b v0.0.0-00010101000000-000000000000  //非標準庫依賴包和版本

上層目錄下自定義的package:

image-20210602002145397

go module會根據 go.mod 的依賴引用關係匯入三方包。如果發現本地cache沒有,就會從遠端拉取。即如果github.com/csgo/rush_b未重定向到本地就會使用 go get 。當 go module下載了遠端包後,同時會自動更新 go.mod 。

需要注意自定義的package函式、變數如果需要被外部引用則首字母應大寫,即包級別的名字都是以大寫字母開頭。


文章有不足的地方歡迎在評論區指出。

歡迎收藏、點贊、提問。關注頂級飲水機管理員,除了管燒熱水,有時還做點別的。

相關文章