golang學(xué)習(xí)筆記2:基本結(jié)構(gòu)與數(shù)據(jù)類型

下面列舉了 Go 代碼中會使用到的 25 個關(guān)鍵字或保留字:


除了以上介紹的這些關(guān)鍵字,Go 語言還有 36 個預(yù)定義標(biāo)識符,其中包含了基本類型的名稱和一些基本的內(nèi)置函數(shù)。


程序一般由關(guān)鍵字、常量、變量、運算符、類型和函數(shù)組成。


程序中可能會使用到這些分隔符:括號?(),中括號?[]?和大括號?{}。


程序中可能會使用到這些標(biāo)點符號:.?,? ; :?和?…


程序的代碼通過語句來實現(xiàn)結(jié)構(gòu)化。每個語句不需要像 C 家族中的其它語言一樣以分號;結(jié)尾,因為這些工作都將由 Go 編譯器自動完成。


如果你打算將多個語句寫在同一行,它們則必須使用;人為區(qū)分,但在實際開發(fā)中我們并不鼓勵這種做法。


如果對一個包進(jìn)行更改或重新編譯,所有引用了這個包的客戶端程序都必須全部重新編譯。


Go 中的包模型采用了顯式依賴關(guān)系的機(jī)制來達(dá)到快速編譯的目的,編譯器會從后綴名為.go?的對象文件(需要且只需要這個文件)中提取傳遞依賴類型的信息。


如果?A.go?依賴?B.go,而?B.go?又依賴?C.go:


編譯?C.go,?B.go, 然后是?A.go.


為了編譯?A.go, 編譯器讀取的是?B.go?而不是?C.go.


這種機(jī)制對于編譯大型的項目時可以顯著地提升編譯速度。


每一段代碼只會被編譯一次


一個 Go 程序是通過 import 關(guān)鍵字將一組包鏈接在一起。


import "fmt" 告訴 Go 編譯器這個程序需要使用 fmt 包(的函數(shù),或其他元素),fmt 包實現(xiàn)了格式化 IO(輸入/輸出)的函數(shù)。包名被封閉在半角雙引號 "" 中。如果你打算從已編譯的包中導(dǎo)入并加載公開聲明的方法,不需要插入已編譯包的源代碼。


函數(shù)


這是定義一個函數(shù)最簡單的格式:


func functionName()


在程序開始執(zhí)行并完成初始化后,第一個調(diào)用(程序的入口點)的函數(shù)是 main.main()(如:C 語言),該函數(shù)一旦返回就表示程序已成功執(zhí)行并立即退出。


函數(shù)里的代碼(函數(shù)體)使用大括號 {} 括起來。


Go 語言雖然看起來不使用分號作為語句的結(jié)束,但實際上這一過程是由編譯器自動完成.


類型


可以包含數(shù)據(jù)的變量(或常量),可以使用不同的數(shù)據(jù)類型或類型來保存數(shù)據(jù)。使用 var 聲明的變量的值會自動初始化為該類型的零值。類型定義了某個變量的值的集合與可對其進(jìn)行操作的集合。


類型可以是基本類型,如:int、float、bool、string;結(jié)構(gòu)化的(復(fù)合的),如:struct、array、slice、map、channel;只描述類型的行為的,如:interface。


結(jié)構(gòu)化的類型沒有真正的值,它使用 nil 作為默認(rèn)值(在 Objective-C 中是 nil,在 Java 中是 null,在 C 和 C++ 中是NULL或 0)。值得注意的是,Go 語言中不存在類型繼承。


Go 程序的一般結(jié)構(gòu)

下面的程序可以被順利編譯但什么都做不了,不過這很好地展示了一個 Go 程序的首選結(jié)構(gòu)。這種結(jié)構(gòu)并沒有被強(qiáng)制要求,編譯器也不關(guān)心 main 函數(shù)在前還是變量的聲明在前,但使用統(tǒng)一的結(jié)構(gòu)能夠在從上至下閱讀 Go 代碼時有更好的體驗。


總體思路如下:


  • 在完成包的 import 之后,開始對常量、變量和類型的定義或聲明。


  • 如果存在 init 函數(shù)的話,則對該函數(shù)進(jìn)行定義(這是一個特殊的函數(shù),每個含有該函數(shù)的包都會首先執(zhí)行這個函數(shù))。


  • 如果當(dāng)前包是 main 包,則定義 main 函數(shù)。


  • 然后定義其余的函數(shù),首先是類型的方法,接著是按照 main 函數(shù)中先后調(diào)用的順序來定義相關(guān)函數(shù),如果有很多函數(shù),則可以按照字母順序來進(jìn)行排序。




Go 程序的執(zhí)行(程序啟動)順序如下:

按順序?qū)胨斜?main 包引用的其它包,然后在每個包中執(zhí)行如下流程:

如果該包又導(dǎo)入了其它的包,則從第一步開始遞歸執(zhí)行,但是每個包只會被導(dǎo)入一次。

然后以相反的順序在每個包中初始化常量和變量,如果該包含有 init 函數(shù)的話,則調(diào)用該函數(shù)。

在完成這一切之后,main 也執(zhí)行同樣的過程,最后調(diào)用 main 函數(shù)開始執(zhí)行程序。?




關(guān)注置頂走一波~



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容