Go語言中的函數名、變量名、常量名、類型名、語句標號和包名等全部的命名,都遵循一個簡單的命名規則:一個名字必須以一個字母(Unicode字母)或下劃線開頭,後面能夠跟任意數量的字母、數字或下劃線.大寫字母和小寫字母是不一樣的:heapSort和Heapsort是兩個不一樣的名字.程序員
Go語言的關鍵字有25個,關鍵字不能用於自定義名字. 分別爲:數組
break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var
還有大約30多個預約義的名字,這些內部預先定義的名字並非關鍵字,你能夠在定義中從新使用它們。在一些特殊的場景中從新定義它們也是有意義的,可是也要注意避免過分而引發語義混亂.app
內建常量: true false iota nil 內建類型: int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr float32 float64 complex128 complex64 bool byte rune string error 內建函數: make len cap new append copy close delete complex real imag panic recover
在習慣上,Go語言程序員推薦使用 駝峯式 命名,當名字有幾個單詞組成的時優先使用大小寫分隔,而不是優先用下劃線分隔。編輯器
Go語言主要有四種類型的聲明語句:var、const、type和func,分別對應變量、常量、類型和函數實體對象的聲明。模塊化
一個Go語言編寫的程序對應一個或多個以.go爲文件後綴名的源文件中。每一個源文件以包的聲明語句開始,說明該源文件是屬於哪一個包。包聲明語句以後是import語句導入依賴的其它包,而後是包一級的類型、變量、常量、函數的聲明語句.函數
package main // main包 import "fmt" // 引入fmt內部包 const price = 212.0 // 浮點型常量 func main() { var f = price // f浮點型變量 var c = (f - 32) * 5 / 9 // c浮點型變量 fmt.Printf("f = %g c = %g\n", f, c) // %g爲浮點型佔位符 fmt.Printf("f:%T,c:%T", f, c) // %T爲打印類型 結果:f:float64,c:float64 }
var聲明語句能夠建立一個特定類型的變量,而後給變量附加一個名字,而且設置變量的初始值。變量聲明的通常語法以下:ui
var 變量名字 類型 = 表達式
指針
// 例如 var name string = "zhy"
其中「類型」或「= 表達式」兩個部分能夠省略其中的一個。若是省略的是類型信息,那麼將根據初始化表達式來推導變量的類型信息。若是初始化表達式被省略,那麼將用零值初始化該變量。 數值類型變量對應的零值是0,布爾類型變量對應的零值是false,字符串類型對應的零值是空字符串,接口或引用類型(包括slice、指針、map、chan和函數)變量對應的零值是nil。數組或結構體等聚合類型對應的零值是每一個元素或字段都是對應該類型的零值。code
var s string fmt.Println(s) // ""
也能夠在一個聲明語句中同時聲明一組變量,或用一組初始化表達式聲明並初始化一組變量。若是省略每一個變量的類型,將能夠聲明多個類型不一樣的變量(類型由初始化表達式推導):對象
var i, j, k int // int, int, int var b, f, s = true, 2.3, "four" // bool, float64, string
一組變量也能夠經過調用一個函數,由函數返回的多個返回值初始化:
var f, err = os.Open("./project.log") // 打開文件 f爲句柄 err爲錯誤
在函數內部,有一種稱爲簡短變量聲明語句的形式可用於聲明和初始化局部變量。它以「名字 := 表達式」形式聲明變量,變量的類型根據表達式來自動推導。
name := "zhy" f,err := os.Open("./project.log")
一個變量對應一個保存了變量對應類型值的內存空間。一個指針的值是另外一個變量的地址。一個指針對應變量在內存中的存儲位置。並非每個值都會有一個內存地址,可是對於每個變量必然有對應的內存地址。經過指針,咱們能夠直接讀或更新對應變量的值,而不須要知道該變量的名字(若是變量有名字的話)。指針的定義爲*+類型
好比*int
等,或者把變量的地址賦值給指針,編輯器會自動推到指針的類型
var number *int var a = 100 var b = &a // &爲取值符
用*+指針變量
出去所指變量的值
fmt.Println(*p) // 0 fmt.Println(*b) // 100
另外一個建立變量的方法是調用用內建的new函數。表達式new(T)將建立一個T類型的匿名變量,初始化爲T類型的零值,而後返回變量地址,返回的指針類型爲*T
。
p := new(int) // p, *int 類型, 指向匿名的 int 變量 fmt.Println(*p) // "0" *p = 2 // 設置 int 匿名變量的值爲 2 fmt.Println(*p) // "2"
變量的生命週期指的是在程序運行期間變量有效存在的時間間隔。對於在包一級聲明的變量來講,它們的生命週期和整個程序的運行週期是一致的。而相比之下,局部變量的聲明週期則是動態的:每次從建立一個新變量的聲明語句開始,直到該變量再也不被引用爲止,而後變量的存儲空間可能被回收。函數的參數變量和返回值變量都是局部變量。它們在函數每次被調用的時候建立。
x = 100
*p = "zhy"
stu.name = "zhy"
lst[1] = lst[1] + 1
x *= 6
等同於 x = x * 6
x++
x--
x,y = y,x
f, err = os.Open("project.log")
一個類型聲明語句建立了一個新的類型名稱,和現有類型具備相同的底層結構。新命名的類型提供了一個方法,用來分隔不一樣概念的類型,這樣即便它們底層類型相同也是不兼容的。
type 類型名字 底層類型
Go語言中的包和其餘語言的庫或模塊的概念相似,目的都是爲了支持模塊化、封裝、單獨編譯和代碼重用。一個包的源代碼保存在一個或多個以.go爲文件後綴名的源文件中,一般一個包所在目錄路徑的後綴是包的導入路徑;
一個聲明語句將程序中的實體和一個名字關聯,好比一個函數或一個變量。聲明語句的做用域是指源代碼中能夠有效使用這個名字的範圍。
func f() {} var g = "g" func main() { f := "f" fmt.Println(f) // main函數的做用域 fmt.Println(g) // g包做用域 fmt.Println(h) // pinic報錯 沒有找到 }
用:=
聲明變量,只能在函數內使用,在全局使用會報錯