程序結構
命名
如果一個名字是在函數內部定義,那么它的就只在函數內部有效。如果是在函數外部定義,那么將在當前包的所有文件中都可以訪問。
名字的開頭字母的大小寫決定了名字在包外的可見性。大寫外部可以訪問,小寫包內訪問。包名一般小寫。
聲明
Go語言主要有四種類型的聲明語句:var、const、type和func,分別對應變量、常量、類型和函數實體對象的聲明。
每個源文件以包的聲明語句開始,說明該源文件是屬于哪個包。包聲明語句之后是import語句導入依賴的其它包,然后是包一級的類型、變量、常量、函數的聲明語句,包一級的各種類型的聲明語句的順序無關緊要。
變量
變量聲明的一般語法如下:
var 變量名字 類型 = 表達式
其中“類型”或“= 表達式”兩個部分可以省略其中的一個。如果省略的是類型信息,那么將根據初始化表達式來推導變量的類型信息。如果初始化表達式被省略,那么將用零值初始化該變量。
簡短變量聲明
在函數內部,有一種稱為簡短變量聲明語句的形式可用于聲明和初始化局部變量。它以“名字 := 表達式”形式聲明變量,變量的類型根據表達式來自動推導
請記住“:=”是一個變量聲明語句,而“=”是一個變量賦值操作。
簡短變量聲明語句對已經聲明過的變量只有賦值行為。但簡短變量聲明語句中必須至少要聲明一個新的變量。而且簡短變量聲明語句只有對已經在同級詞法域聲明過的變量才和賦值操作語句等價,如果變量是在外部詞法域聲明的,那么簡短變量聲明語句將會在當前詞法域重新聲明一個新的變量。
指針
一個指針的值是另一個變量的地址。一個指針對應變量在內存中的存儲位置
new函數
- 表達式new(T)將創建一個T類型的匿名變量,初始化為T類型的零值,然后返回變量地址,返回的指針類型為*T
- 由于new只是一個預定義的函數,它并不是一個關鍵字,因此我們可以將new名字重新定義為別的類型。
- 例子:
func delta(old, new int) int { return new - old }
- 由于new被定義為int類型的變量名,因此在delta函數內部是無法使用內置的new函數的
變量的生命周期
變量的生命周期指的是在程序運行期間變量有效存在的時間間隔。
- 包一級聲明的變量,生命周期和整個程序的運行周期是一致的
- 局部變量的聲明周期則是動態的:從每次創建一個新變量的聲明語句開始,直到該變量不再被引用為止,然后變量的存儲空間可能被回收