天天看點

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

更多會關注golang中特有結構,與其他語言如C、python中相似結構(命名、聲明、指派、作用域等)不再贅述。

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

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

一、golang類型别名

在go1.9中引入類型别名的特性,其中兩個内置類型

byte

rune

uint8

int32

的别名。類型别名即字面意思換個名字,兩者是相同類型。

類型聲明語句一般出現在包一級,是以如果新建立的類型名字的首字元大寫,則在包外部也可以使用。

解決問題:大規模重構期間啟用漸進式代碼修複,特别是将類型從一個包移動到另一個包,以便引用舊名稱的代碼與引用新名稱的代碼互操作。類型别名對于允許使用單個頂級導出 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

為内置标準庫。

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

GOPATH

目錄已下載下傳的package

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

$GOROOT/src

目錄内置package

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

在沒有使用 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:

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

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

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

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

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