Go入門篇
參考資料
Go語言的特性
ofollow,noindex">https://www.jianshu.com/p/1bda5f24e474菜鳥教程Go 語言入門級教程
http://www.runoob.com/go/go-program-structure.htmlGo語言 高階入門教程系列
https://www.jianshu.com/c/2ba5a726a9f1Go語言 高階教程系列
https://www.jianshu.com/u/1381dc29fed9Go 語言最主要的特性:
Golang遵循“少即是多”的設計哲學,追求簡潔優雅,就是說如果異常價值不大,就不會將異常加入到語言特性中。
- 主要優點
- 易於開發:程式碼簡潔(變數申明和省略分號)、使用方便(允許多返回值)、依賴更少避免臃腫、關鍵詞少
- 垃圾自動高效回收
- 高併發效能好
- 其它的小特性
- 更豐富的內建型別
- 函式多返回值
- 錯誤處理
- 匿名函式和閉包
- 型別和
- 併發程式設計
- 反射
- 語言互動性
- 主要缺點
- 不支援繼承(繼承可以少些程式碼),但是可以通過成員變數的方式實現類似的效果
Go的一些產品
- Docker
- 今日頭條的後臺伺服器
細節
- package main表示一個可獨立執行的程式,每個 Go 應用程式都包含一個名為 main 的包。
- 每行程式碼不需要分號,因為編譯的時候會自動補齊
- 申明變數的時候可以不指定型別,可以直接var,也可以直接 number :=10
g, h := 123, "hello"
- 常量中的資料型別只可以是布林型、數字型(整數型、浮點型和複數)和字串型
const a, b, c = 1, false, "str" const ( Unknown = 0 Female = 1 Male = 2 )
- 陣列:類似於java的 int[] 陣列
var variable_name [SIZE] variable_type var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0} var n [10]int//申明一個長度為10的int型別的陣列 arr:=[...] int {2:1,4:3} //申明一個下標為2的值為1,下標為4的值為3的長度為5的陣列,因為最大下標是4
- 切片是對陣列的抽象。陣列要指定長度 [5],或者[...],但是切片不需要指定長度 [],支援cap()、len()、append()、copy()等函式,類似於java的ArrayList
s :=[] int {1,2,3 } fmt.Println(cap(s),len(s),s[0]) 初始化切片s,是陣列arr的引用 s := arr[startIndex:endIndex] 預設endIndex時將表示一直到arr的最後一個元素 s := arr[startIndex:] 通過內建函式make()初始化切片s,[]int 標識為其元素型別為int的切片 s :=make([]int,len,cap) 往一個切片中追加一個或者多個元素 numbers = append(numbers, 2,3,4)
- range 關鍵字用於 for 迴圈中迭代陣列(array)、切片(slice)、通道(channel)或集合(map)的元素,取代 len(slice)
nums := []int{2, 3, 4} for i, num := range nums { if num == 3 { fmt.Println("index 3 :", i) }else{ fmt.Println(num) } } for j:=0; j< len(nums);j++ { if nums[j] == 3 { fmt.Println("index 3 :", j) }else{ fmt.Println(nums[j]) } }
- 指標的使用:一個指標變數指向了一個值的記憶體地址,通過var-type來申明指標的型別, var_name 來獲取指標指向的真實值,var_name表示指標指向的記憶體地址
var var_name *var-type var a int= 20/* 宣告實際變數 */ var ip *int/* 宣告指標變數 */ ip = &a/* 指標變數的儲存地址 */ /* 使用指標訪問值 */ fmt.Printf("*ip 變數的值: %d\n", *ip )//列印20
- 申明一個Map的鍵值對集合,省去了get set方法,
/* 宣告變數,預設 map 是 nil */ var map_variable map[key_data_type]value_data_type /* 使用 make 函式 */ map_variable := make(map[key_data_type]value_data_type) 初始化 countryCapitalMap := map[string]string{"France": "Paris", "Italy": "Rome", "Japan": "Tokyo", "India": "New delhi"} set方法 countryCapitalMap [ "France" ] = "Paris" countryCapitalMap [ "Italy" ] = "羅馬" get方法,ok顯示是否存在該key captial, ok := countryCapitalMap [ "美國" ] /*如果確定是真實的,則存在,否則不存在 */ delete(countryCapitalMap, "France") 遍歷Map for country := range countryCapitalMap { fmt.Println(country, "首都是", countryCapitalMap [ country ]) }
- 介面:它把所有的具有共性的方法定義在一起,任何其他型別只要實現了這些方法就是實現了這個介面。
定義一個Phone的介面,它的實現類必須實現call()方法 type Phone interface { call() } 定義一個普通類NokiaPhone type NokiaPhone struct { } 實現call()的方法 func (nokiaPhone NokiaPhone) call() { fmt.Println("I am Nokia, I can call you!") } 使用 func main() { var phone Phone phone = new(NokiaPhone) phone.call() }
Go語法 Vs Java語法
- 類物件申明吊打Java
- 不需要再寫get、set、和花式建構函式、toString等方法,Go物件自帶了
type Books struct { title string author string subject string book_id int }
- 變數宣告更簡潔,靜態型別但是自動推斷,甚至比JavaScript更簡潔
var age=23 title := "Project Leader"
-
分號換行符可以省略,編譯時自動新增
-
Go的for迴圈更簡潔
i := 1; for i < 5 { fmt.Println(i); i++; } for i := 1; i < 5; i++ { fmt.Println(i); } i := 1; for { fmt.Println(i); if ++i > 5 { break;// or return; } }