a.一個名字必須以一個字母(Unicode字母)或者下劃線開頭。數組
b.後面能夠跟任意數量的字母,數字,下劃線。app
c.區分大小寫ide
break default func i nterface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var
內建常量: 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
a.內部預訂名字不是關鍵字模塊化
b.能夠再定義,從新使用它們函數
c.通常不要定義它們,除非在一些特殊的場景裏。(什麼場景能使用,我也想不到。反正少用就對了) 工具
a.若是一個名字是在函數內部定義,那麼他就只在函數內部有效。ui
b.若是在函數外部定義,那麼將在當前包的全部文件夾中均可以訪問。this
c.若是一個名字是大寫字母開頭的(必須是在函數外部定義的包級名字;包級函數名自己也是包級名字),那麼他是能夠導出的,也就是說能夠被外部的包訪問。spa
d.包自己的名字通常總用小寫字母。指針
go語言推薦使用駝峯命名方式
a.聲明語句定義了程序的各類實體對象以及部分或所有屬性
b.四種類型:
變量:var
常量:const
類型:type
函數:func
package main //導入聲明 import ( "fmt" ) //常量聲明,包一級範圍聲明。能夠再整個包中的每一個源文件中使用 const boilingF = 212.0 //函數聲明,無返回值,無參數的函數申明 func main() { //變量聲明,函數級聲明,只能在函數中使用 bool1 :=true if bool1{ fmt.Println("this value is true") }else { fmt.Println("this value is fales") } c := test(1) fmt.Println(c) } //帶參數和返回值的函數聲明,無返回值省略 返回值類型 一項。可是哪怕沒有參數,也不可省略(參數)這一項。 // func 函數名(參數)返回值類型 {執行語句} func test(a int) int { b := a +1 return b }
1.變量聲明的語法
var 變量名 類型 = 表達式 var s string = "我是神" //正常格式 var s string //省略表達的方式,默認爲零值 var s = "我是神" //省略類型的方式,由編譯器自行判斷類型 var s,j,i str //申請多個統一類型的變量,且省略表達式所有爲零值。 var b,g,m = true,2.3 ,"four" //申明多個變量,根據表達式編譯器自行判斷類型 var f,err = os.Open(name) //申請兩個變量接收函數的返回值,類型有系統判斷。
2.各種型的零值:
數值類型(int):零值爲0
布爾類型(bool):零值爲false
字符串類型(string):零值爲空字符串 ""
接口類型和引用類型(包括slice、map、chan和函數):零值爲nil
數組或結構體等聚合類型對應的零值是每一個元素或者字段都是對應該類型的零值。
3.零值的意義
a.零值初始化機制能夠確保每一個聲明的變量老是有一個良好定義的值。
b.能夠在沒有增長額外工做的前提下確保邊界條件的合理性爲。
c.不至於致使錯誤或產生不可預知的行爲
d.go語言中不存在未初始化的變量。
e.應該讓一些聚合類型的零值也具備意義,能夠保證不管任何類型的變量老是有一個合理有效的零值狀態。
1.簡短變量聲明的語法
變量名 := 表達式 //上述的變量聲明方式均可以用簡短變量聲明的方式進行聲明 s := "我是神" s,j :=os.Open(name)
2.簡短變量聲明方式注意點
a.只能在函數內部使用,在函數外部使用必須用var聲明
b.簡短變量聲明語句中必須至少要聲明一個新的變量
//用簡短申明方式聲明兩個變量 in,err := os.Open(name) //用簡短聲明方式聲明一個變量,另一個爲賦值操做 out ,err := os.Open(name) //沒有聲明新的變量,不能編譯經過 out ,err := os.Open(name)
1.new()函數的語法
變量名 := new(T) //T爲數據類型 p := new(int) fmt.Println(p) fmt.Println(*p) *p = 2 fmt.Println(p) fmt.Println(*p) //0xc00001c060 //0 //0xc00001c060 //2
a.new()函數建立的爲變量的內存地址,即指針。數據類型爲 *T
b.每次調用new()函數返回的都是新的變量的地址。
2.new函數的注意點
1)new函數這是一個預約義的函數,不是一個關鍵字。
2)咱們能夠將new名字從新定義爲別的類型
3)new被定義爲新的類型的變量名,那麼在其做用域內是沒法使用new()函數的
func delta (old, new int) int { return new-old } //因爲new被定義爲int類型的變量,所以在delta函數中是沒法使用內置de new()函數的。
1.什麼變量的生命週期
變量的生命週期指的是在程序運行期間變量有效存在的時間間隔。
2.包一級聲明的變量的生命週期
和整個程序的運行週期是一直的
3.局部變量的的生命週期
a.從每次建立一個新變量的聲明語句開始
b.直到該變量再也不被引用爲止
v.變量的存儲空間可能被回收
d.函數的參數變量和返回值變量都是局部變量,在函數每次被調用是建立。
4.全局變量的保存在堆中,不便於回收和管理,生命週期長。局部變量的保存在棧中,方便回收和管理,生命週期端。使用的技術爲「變量逃逸」技術。
x =1 //變量名賦值 *p = ture //指針賦值 person.name = 「bob」 //結構體字段賦值 count[x] = count[x] * scale //數組,slice或map的元素賦值 count[x] *= scale //運算並賦值 v :=1 v ++ //等價於v = v+1 v -- //等價於v= v-1
x,y = y,x //交換x.y位置 a[i] , a[j] = a[j] , a[i] x , y = y , x+y v ,ok = m[key] v ,ok = x.(T) v ,ok = <-ch _,err = io.Copy(dst, src) _爲空白標識符,是捨棄掉不須要處理的值。
即 「 = 」的左邊和右邊必須具備相同的數據類型
1.類型聲明語句建立了一個新的類型類型名稱,和現有的類型具備相同的底成結構。
2.新命名的類型提供了一個方法,用來分隔不一樣的概念的類型。
3.這樣即便底成類型相同也是不兼容的。
//type 類型名字 底成類型 package tempconv import "fmt" type Celsius float64 //攝氏度 type Fahrenheit float64 //華氏度 const ( AbsoluteZeroC Celsius = -273.15 //絕對零度 FreezingC Celsius = 0 //結冰點溫度 BoilingC Celsius = 100 //沸水溫度 ) func CToF(c Celsius) Fahrenheit { return Fahrenheit(c*9/5 + 32) } func FToC(f Fahrenheit) Celsius { return Celsius((f - 32) * 5 / 9) } //!- func (c Celsius) String() string { return fmt.Sprintf("%g°C", c) }
a.Celsius和Fahrenheit分別對應不一樣類型的溫度單位。
b.他們擁有相同的底成類型float64,可是他們是不一樣的數據類型。
c.所以他們不能再一塊兒運算,也不能作比較
三、類型轉換
a.Celsius(t)和Fahrenheit(t)是類型轉化操做,不是說函數調用,而是將值改變爲一直對應的類型。
b.對於每個類型T,都有一個對應的類型轉換操做T(x),用於將x轉換爲T類型。
c.當T爲指針類型時,可能須要用小括號包裝T,好比(*int)(0)
d.只有兩個類型的底成基礎結構一致時,才容許轉換操做。
e.轉換操做只改變類型,不會影響值自己。(可是float轉成int時會丟棄小數部分,形成值的改變)
a.go語言中的包和其餘語言的庫或者模塊的概念類似
b.目的是爲了支持模塊化,封裝,單獨編譯和代碼重用
c.一個包的源代碼保存在一個或多個以.go爲文件後綴名的源文件中
a.每個包都對應一個獨立的名字空間。(我理解的意思是,每一個包的包名都不該相同)
c.一般一個包所在目錄路徑的後綴是包的導入路徑:$GOPATH/src/包名
d.若是導入包可是沒有使用到改包,編譯時會報錯。
三、包的初始化
1.普通的初始化
a.若是包中還有多個.go源文件,它們將按照發給編譯器的順序進行初始化
b.go語言的構建工具首先會將.go文件根據文件名排序,而後依次調用編譯器編譯
2.複雜的初始化
a.例如某些表格數據初始化應不是一個簡單的賦值過程。
b咱們能夠用init初始化函數來簡單初始化工做。
c.每一個文件均可以包含多個init初始化函數。