最小結構
package main//聲明包--沒有分號,編譯器層級自動添加分號,表明該檔案裡的函數屬於哪一個包import (//匯入包--程式中需要使用哪些包就需要事先匯入。import匯入的包可以用小括弧括起來,小括弧後面沒有分號 "fmt"//常用於輸入輸出 //多個包之間直接換行,不需用逗號或者分號)func main(){//所有的可執行程式都需要一個main函數,main函數沒有傳回型別,而且處於main包裡面 fmt.Println("Hello Golang")//沒有分號}
基本特點
強型別語言,在運行時就不必再推導變數類型了,所以比其他類型語言效率高
var 變數名 變數類型
聲明了變數一定要使用,為了同統一風格;
左大括弧一定是在一行的最後,不能是開頭,為了風格統一;
所有的可執行程式都需要一個main函數,main函數沒有傳回型別
函數可以帶參數,形參的聲明格式和變數一樣
變數的隱式聲明:變數名 := 運算式 編譯器會自動推導變數的類型
同一個包名裡的函數可以互相直接調用,省略調用前面的包名;如果不在一個包,需要先聲明包名,在調用的時候在首碼的位置加入包名; 包名.函數名(參數列表)以及包名.變數名
使用gofmt工具對源碼格式進行調整,使用-w選項進行回寫入源檔案 語言特性 記憶體回收–自動管理記憶體,只需要new,不用擔心delete,在Go中是make對應new。 天然並發–語言層面支援並發,在CPU多核時代大大提高開發效率;goroutine輕量級線程,基於CSP模型。一個Go進程就可以充分使用多核的特性。redis-單進程單線程–需要多執行個體;Nginx–多執行緒模式;傳統並發—線程池容量與CPU核心數有關,否則會增加CPU負載;Go語言在執行階段程式庫裡面啟動了16個或者64個物理線程。實現了goroute的線程調度。 channel(管道)–類似於Linux中的pipe,用於goroutine之間的通訊,適用於所有類型(還可以使用全域變數(不推薦),要注意包內的可見度–大小寫)
package mainimport ( "fmt")func main() { pipe := make(chan int, 3)//make類似於new/malloc,用於分配記憶體 //chan表明是開闢一個channel類型的空間 //int表明channel裡面的元素是int類型,3是channel的容量 //超過容量會阻塞,等待channel被消耗有多餘空間,才會把內容寫入channel //預設情況下會提前暴露出現阻塞的位置(如果沒有其他goroutine,發生阻塞,go的執行階段程式庫會認為發生死結deadlock) pipe <- 1 pipe <- 2 pipe <- 3 var t1 int t1 =<- pipe pipe <- 4 fmt.Println(t1) fmt.Println(len(pipe))}
4.多傳回值
func My_func(a int,b int)(int, int){//多個參數和傳回型別之間用逗號隔開 sum := (a + b) avg := (a+b)/2 return sum,avg//多個傳回值之間用逗號隔開}
使用底線來拋棄函數傳回值 包的概念 應用程式都有一個main包,main包裡面有且僅有一個main函數;應用程式有且僅有一個main包 把相同功能的或者功能相關的程式碼群組織在一個目錄,這個目錄就是包;Go是通過包來組織代碼的,任何一個源檔案都必須屬於某個包。沒有包就沒有其他代碼—模組劃分,和檔案夾對應,同一個檔案夾下的go檔案的package 包名都必須一樣 包可以被別的包引用 包的主要用途是為了提高代碼的可複用性
//Calc.gopackage calcfunc Add(a int, b int) int{ sum := (a + b) return sum}//main.sopackage mainimport ( "fmt" "calc")func main() { sum := calc.Add(3,5) fmt.Println("sum= %d",sum)}
微服務:每個服務獨立,不依賴於其他模組 編譯 設定好GOPATH環境變數為自己的工作區,也就是項目源檔案的存放目錄或者其上層目錄 預設會在GOPATH下面的src目錄開始找go源檔案,所以只需要從src的下一級目錄開始指定要編譯的整個包 產生的exe可執行檔會出現在GOPATH目錄下,用go build 的時候最深層次的目錄名命名