golang學習筆記2:基本結構與資料型別
下面列舉了 Go 程式碼中會使用到的 25 個關鍵字或保留字:
除了以上介紹的這些關鍵字,Go 語言還有 36 個預定義識別符號,其中包含了基本型別的名稱和一些基本的內建函式。
程式一般由關鍵字、常量、變數、運算子、型別和函式組成。
程式中可能會使用到這些分隔符:括號 (),中括號 [] 和大括號 {}。
程式中可能會使用到這些標點符號:. , ; : 和 …
程式的程式碼通過語句來實現結構化。每個語句不需要像 C 家族中的其它語言一樣以分號;結尾,因為這些工作都將由 Go 編譯器自動完成。
如果你打算將多個語句寫在同一行,它們則必須使用;人為區分,但在實際開發中我們並不鼓勵這種做法。
如果對一個包進行更改或重新編譯,所有引用了這個包的客戶端程式都必須全部重新編譯。
Go 中的包模型採用了顯式依賴關係的機制來達到快速編譯的目的,編譯器會從字尾名為.go 的物件檔案(需要且只需要這個檔案)中提取傳遞依賴型別的資訊。
如果 A.go 依賴 B.go,而 B.go 又依賴 C.go:
編譯 C.go, B.go, 然後是 A.go.
為了編譯 A.go, 編譯器讀取的是 B.go 而不是 C.go.
這種機制對於編譯大型的專案時可以顯著地提升編譯速度。
每一段程式碼只會被編譯一次
一個 Go 程式是通過 import 關鍵字將一組包連結在一起。
import "fmt" 告訴 Go 編譯器這個程式需要使用 fmt 包(的函式,或其他元素),fmt 包實現了格式化 IO(輸入/輸出)的函式。包名被封閉在半形雙引號 "" 中。如果你打算從已編譯的包中匯入並載入公開宣告的方法,不需要插入已編譯包的原始碼。
函式
這是定義一個函式最簡單的格式:
func functionName()
在程式開始執行並完成初始化後,第一個呼叫(程式的入口點)的函式是 main.main()(如:C 語言),該函式一旦返回就表示程式已成功執行並立即退出。
函式裡的程式碼(函式體)使用大括號 {} 括起來。
Go 語言雖然看起來不使用分號作為語句的結束,但實際上這一過程是由編譯器自動完成.
型別
可以包含資料的變數(或常量),可以使用不同的資料型別或型別來儲存資料。使用 var 宣告的變數的值會自動初始化為該型別的零值。型別定義了某個變數的值的集合與可對其進行操作的集合。
型別可以是基本型別,如:int、float、bool、string;結構化的(複合的),如:struct、array、slice、map、channel;只描述型別的行為的,如:interface。
結構化的型別沒有真正的值,它使用 nil 作為預設值(在 Objective-C 中是 nil,在 Java 中是 null,在 C 和 C++ 中是NULL或 0)。值得注意的是,Go 語言中不存在型別繼承。
Go 程式的一般結構
下面的程式可以被順利編譯但什麼都做不了,不過這很好地展示了一個 Go 程式的首選結構。這種結構並沒有被強制要求,編譯器也不關心 main 函式在前還是變數的宣告在前,但使用統一的結構能夠在從上至下閱讀 Go 程式碼時有更好的體驗。
總體思路如下:
-
在完成包的 import 之後,開始對常量、變數和型別的定義或宣告。
-
如果存在 init 函式的話,則對該函式進行定義(這是一個特殊的函式,每個含有該函式的包都會首先執行這個函式)。
-
如果當前包是 main 包,則定義 main 函式。
-
然後定義其餘的函式,首先是型別的方法,接著是按照 main 函式中先後呼叫的順序來定義相關函式,如果有很多函式,則可以按照字母順序來進行排序。
Go 程式的執行(程式啟動)順序如下:
按順序匯入所有被 main 包引用的其它包,然後在每個包中執行如下流程:
如果該包又匯入了其它的包,則從第一步開始遞迴執行,但是每個包只會被匯入一次。
然後以相反的順序在每個包中初始化常量和變數,如果該包含有 init 函式的話,則呼叫該函式。
在完成這一切之後,main 也執行同樣的過程,最後呼叫 main 函式開始執行程式。
關注置頂走一波~