1. 程式人生 > >帶你學夠浪:Go語言基礎系列 - 8分鐘學基礎語法

帶你學夠浪:Go語言基礎系列 - 8分鐘學基礎語法

> 文章每週持續更新,原創不易,「三連」讓更多人看到是對我最大的肯定。可以微信搜尋公眾號「 後端技術學堂 」第一時間閱讀(一般比部落格早更新一到兩篇) 對於一般的語言使用者來說 ,20% 的語言特性就能夠滿足 80% 的使用需求,剩下在使用中掌握。 基於這一理論,Go 基礎系列的文章不會刻意追求面面俱到,但該有知識點都會覆蓋,目的是帶你快跑趕上 Golang 這趟新車。 **Hurry up , Let's go !** ## 一個好訊息一個壞訊息一個潛規則 Go 的語法類似 C 語言,你是從 C/C++ 語言過來的話學習成本很低,其他語言過來甚至沒有程式設計基礎也沒關係,這門語言入門很輕鬆。 **好訊息**是你的鍵盤得救了,在 Go 的世界裡不用在每個語句後面加分號了,C 和C++ 程式設計師聽了喜大普奔,鍵盤不那麼容易磨損了。 **壞訊息**帶給習慣花括號換行的朋友,在 Go 中第一個花括號 `{` 不能換行寫,必須寫在同一行,否則編譯不過! **潛規則**是任何在 Go 中定義的變數必須使用,如果定義了變數不使用,編譯不過! 怎麼樣?是不是感覺到滿滿的霸道總裁味道? 其實約束多了,程式設計師自由發揮的空間變少,出錯的概率也會大大降低,Google 的大佬們怕你犯錯,操碎了心。 ![](https://imgkr.cn-bj.ufileos.com/70b0412d-147a-4e03-827e-c5c0bccae2e4.png) ## 包 ### 概念 Go 語言程式都由包構成,類似其他語言中的模組概念,主程式都從 main 包開始執行。 所以一個程式開頭是下面的語句: ```go package main ``` 在程式中也可以匯入其他包,這樣就可以使用其他包定義的函式或變數。 ### 匯入 匯入包語法有多種姿勢。 #### 匯入姿勢一:單獨匯入 ```go import os // 匯入 os 包 import fmt /* 匯入 fmt 包*/ ``` **fmt 包**:包內有格式化 IO 函式,類似 C 中的 `stdio.h` 和 C++ 中的 `iostream` ,初學者必備,導它! **os 包** :中實現了一些 作業系統函式,不依賴平臺的介面 **另外,關於註釋,如你所見,完全就是 C 語言裡的註釋形式,**`//` 或 `/**/ ` 都是允許的。 #### 匯入姿勢二:分組匯入 ```go import ( "fmt" "os" ) ``` 可以把需要的包,用括號放在一起匯入。 #### 匯入姿勢三:指定別名匯入 可以在匯入的時候指定匯入包的別名,這樣在呼叫包函式的時候,可以直接使用包別名。 ```go import f "fmt" // 用別名f 代替 fmt f.Println("go go go") // 用 f 代替了 fmt 呼叫 Println 函式 ``` ### 包匯出名稱約定 包中定義的函式或變數,如果是大寫字母開頭,那麼它就是可以匯出的,外部使用包的使用者可以訪問到,類似 C++ 中的 `public` 標識。相反,小寫字母開頭的名字外部無法使用,使用會報錯。 ```go // 如下,Println 和 Getenv 都是大寫的名字 fmt.Println(os.Getenv("GOPATH")) ``` ## 基本型別 #### 內建型別 Go 語言內建的資料型別有下面這些,其實基本上看型別名字,就差不多能知道是什麼型別了。 ```go int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr float32 float64 complex128 complex64 bool byte rune string error ``` 平常用的最多的型別: `int` 代表整型,在 32 位系統上通常為 32 位,在 64 位系統上則為 64 位。 `string` 字串型別 `bool` 布林型別,分 `true` 和 `false` 兩種值。 #### 建立型別 下面的語法建立一個新的型別,類似C++中的typedef語法。 `type 新型別名字 底層型別` ```go type ProgramType string // 定義新型別 ProgramType var t1 ProgramType = "Golang" var t2 ProgramType = "C++" ``` 不過Go中建立的新型別即使底層型別是一致的也不能相互操作,**這樣起到很好的型別隔離作用**。 比如下面的程式碼,雖然`ProgramType` 和 `CompanyType` 都是` string` 型別,但是不能相互操作,下面舉例說明: ```go type ProgramType string // 定義新型別 ProgramType type CompanyType string // 定義新型別 ProgramType var t2, t2 ProgramType = "Golang", "C++" var c1, c2 CompanyType = "Google", "Tencent" fmt.Println(t1+t2) // 同類型相加合法 fmt.Println(t1+c1) // 不同型別相加非法 ``` #### 型別轉換 不像 C 中有隱式型別轉換,**在 Go 中 不同型別的項之間賦值時需要顯式轉換,否則編譯會報錯**!語法上,相對於 C 語言的強制轉換語法換了下括號的位置,Go 語法如下。 ``` T(v) // 把值 v 轉換為型別 T ``` 舉例: ```go var varint int = 66 var varf float32 = float32(varint) // int 轉換 float32 fmt.Printf("%T %v %T %v \n", varint, varint, varf, varf) // %T輸出值的型別 %v輸出值 ``` ## 變數 ### 宣告 Go 裡面的變數宣告其實和 C 語言差不多,唯一的區別是把變數型別放在在變數名字後面,另外多了一個 `var` 關鍵字標識。 ```go var imVar int // 聲明瞭一個 int 型別的 imVar 變數 ``` 當然也可以多個同類型變數一起宣告 ```go var imVar1, imVar2, imVar3 int // 一口氣聲明瞭三個 int 型別的變數 ``` 或者,多個不同型別的變數宣告分組一起宣告 ```go var ( i int b bool s string ) ``` ### 初始化 #### 未初始化 未初始化的物件會被賦予**零值**,也就是預設值。 - 數值型別初始值 `0` - 布林型別初始值 `false` - 字串為初始值 `""`(空字串) #### 普通初始化 可以宣告之後單個初始化 ```go var imVar int imVar = 6 ``` 也可以宣告和初始化一步到位 ```go var imVar0 int = 7 ``` 還可以批量宣告加初始化一步到位 ```go var imVar4, imVar5 int = 4, 5 ``` 多個不同型別的變數宣告和初始化可以分組同時進行,像下面這樣。 ```go var ( i int = 1 b bool = false s string = "golang" ) ``` #### 偷懶初始化 ##### 型別自動推導 如果初始化式右邊的值是已存在確定型別的值,可以偷懶省略變數型別,聰明的 Go 會自動推導型別。 ```go var imVar4, imVar5 = 4, 5 // 省略了左邊的 int 型別,自動推導imVar4, imVar5是int型別 ``` #### ##### 簡短初始化 **在函式內部**,可以使用簡短賦值語句` := `來代替 `var` 關鍵字**宣告並初始化**變數。 ```go imVar6, imVar7 := 8, 9 // 宣告並初始化了 imVar6, imVar7 ``` ## 常量 常量用 `const` 關鍵字宣告,並且宣告之後必須緊接著賦值,常量可以是字元、字串、布林值或數值 ,注意:**常量不能用 `:=` 語法宣告** 。 ```go const imCnt int = 1 // 帶型別的常量定義 const imCnt1 = 1 // 省略型別的常量定義,自動推導型別 ``` Go 語言內建下面幾種常量 ```go true false iota nil // 內建常量 ``` ## 函式 ### 宣告 函式用關鍵字 `func` 來宣告,帶引數列表,把返回值型別放在最後,下面定義了一個簡單的乘法函式,帶兩個整型引數,返回值也是整型。 ```go func mult(i int, j int) int { return i * j } ``` 當函式引數型別相同時,可以只寫最後一個引數的型別,下面這樣簡寫也是可以的。 ```go func mult(i, j int) int { return i * j } ``` ### 返回值 #### 多返回值 函式返回值可以是一個,也可以是多個,下面的函式就返回了 `i` 的平凡和 `j` 的平方兩個返回值。 ```go func more(i, j int) (int, int) { return i * i, j * j } ``` #### 返回值命名 前面例子只指定了返回值型別,可以指定返回值名稱,這樣更加便於理解,同時,指定的名稱可在函式內使用。 ```go func retName(i, j int) (x, y int) { x = i * i y = j * j return x, y // 可用 return 代替,表示返回所有已命名的返回值。 } ``` ## 總結 通過本文的學習,我們掌握了 Golang 中的幾個基礎概念和用法:包、基本資料型別、變數、常量、函式。這些語法基礎是Golang 的下層建築,萬丈高樓平地起,本節為後續學習打下了基礎。 感謝各位的閱讀,文章的目的是分享對知識的理解,技術類文章我都會反覆求證以求最大程度保證準確性,若文中出現明顯紕漏也歡迎指出,我們一起在探討中學習. 今天的技術分享就到這裡,我們下期再見。 ----- **原創不易,不想被白票,如果在我這有收穫,就動動手指「點贊」和「轉發」是對我持續創作的最大支援。** > 可以微信搜尋公眾號「 後端技術學堂 」回覆「資料」「1024」有我給你準備的各種程式設計學習資料。文章每週持續更新,我們下期見!