> 關註TechLeadCloud,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智能實驗室成員,阿裡雲認證的資深架構師,項目管理專業人士,上億營收AI產品研發負責人。 ![file](https://img2023. ...
關註TechLeadCloud,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智能實驗室成員,阿裡雲認證的資深架構師,項目管理專業人士,上億營收AI產品研發負責人。
一、Go的關鍵字列表和分類
介紹
關鍵字(Keywords)是編程語言中預定義的一組特殊辭彙,每個關鍵字都有一個明確的功能和用途。在Go編程語言中,關鍵字起著構建程式邏輯框架的作用,是程式語義和結構的基礎。本篇文章旨在深入探究關鍵字在Go中的定位與應用,以理解其在程式設計中的重要性。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
關鍵字在Go中的定位
語言的基石
關鍵字在任何編程語言中都是基礎構成元素,Go語言也不例外。它們是用於描述程式邏輯、定義數據結構、和處理錯誤等多方面任務的工具。
簡潔與高效
Go語言以其簡潔性和高效性而受到廣泛歡迎,這在很大程度上得益於其有限但高度優化的一組關鍵字。Go僅有25個關鍵字,相較於其他編程語言,這個數字相對較小,但每一個關鍵字都有明確和重要的用途。
可擴展性和靈活性
雖然關鍵字本身是固定的,但Go提供了一系列複合語句和操作符,以實現高度的可擴展性和靈活性。例如,你可以使用 if-else,for 和 switch 關鍵字創建複雜的邏輯結構。
關鍵字分類
聲明各種代碼元素
關鍵字 | 描述 |
---|---|
const | 用於聲明一個或多個常量 |
func | 用於定義新的函數 |
import | 用於導入外部包 |
package | 用於聲明包名,通常位於每個Go源文件的第一行 |
type | 用於聲明自定義類型,如結構體、介面、別名等 |
var | 用於聲明一個或多個變數 |
組合類型的字面表示
關鍵字 | 描述 |
---|---|
chan | 用於聲明一個新的通道(channel) |
interface | 用於定義一個新的介面 |
map | 用於聲明一個新的映射(鍵-值存儲) |
struct | 用於定義一個新的結構體 |
基本流程式控制制語法
關鍵字 | 描述 |
---|---|
break | 用於中斷當前迴圈或 switch 語句 |
case | switch 語句中的一個分支 |
continue | 跳過當前迴圈迭代的剩餘語句,進入下一次迭代 |
default | switch 語句中的預設分支 |
else | if 語句的否定分支 |
fallthrough | 用於 switch 語句中,使控制流繼續執行下一個 case |
for | 用於迴圈 |
goto | 跳轉到標簽(不推薦使用) |
if | 條件語句 |
range | 用於 for 迴圈,遍曆數組、切片、映射或通道 |
return | 用於從函數返回值 |
select | 用於多路通道選擇 |
switch | 用於多分支選擇語句 |
協程和延遲函數調用
關鍵字 | 描述 |
---|---|
defer | 用於延遲執行函數,通常用於清理資源 |
go | 用於啟動一個新的 goroutine,實現併發 |
二、Go的關鍵字全代碼示例
關鍵字全代碼示例
關鍵字 | 代碼示例 | 代碼作用 |
---|---|---|
const | const PI = 3.14159 |
定義常量 PI |
func | func add(x, y int) int { return x + y } |
定義名為 add 的函數 |
import | import "fmt" |
導入 fmt 包 |
package | package main |
定義包名為 main |
type | type Point struct {x, y int} |
定義一個名為 Point 的結構體 |
var | var name string = "John" |
定義一個名為 name 的變數 |
chan | ch := make(chan int) |
創建一個新的整數類型的通道 |
interface | type Writer interface { Write([]byte) error } |
定義一個名為 Writer 的介面 |
map | m := map[string]int{"one": 1} |
創建一個鍵為字元串、值為整數的映射 |
struct | type Circle struct { Radius float64 } |
定義一個名為 Circle 的結構體 |
break | if x > 0 { break } |
如果 x > 0 ,則跳出迴圈 |
case | case "apple": fmt.Println("It's an apple") |
在 switch 語句中,定義一個 case |
continue | if x < 0 { continue } |
如果 x < 0 ,則跳過當前迴圈迭代 |
default | default: fmt.Println("It's default") |
在 switch 語句中,定義一個預設 case |
else | if x > 0 { /*...*/ } else { /*...*/ } |
if 語句的否定分支 |
fallthrough | case 1: fallthrough |
在 switch 語句中,強制執行下一個 case |
for | for i := 0; i < 10; i++ { /*...*/ } |
迴圈10次 |
goto | goto myLabel |
跳轉到 myLabel 標簽(不推薦) |
if | if x > 0 { /*...*/ } |
條件為 x > 0 時,執行某個操作 |
range | for k, v := range m { /*...*/ } |
遍歷映射 m |
return | return x + y |
從函數中返回 x + y |
select | select { case <-ch: /*...*/} |
多路通道選擇 |
switch | switch x { case 1: /*...*/ } |
多分支選擇 |
defer | defer fmt.Println("bye") |
延遲執行 fmt.Println("bye") 直到函數退出 |
go | go doSomething() |
在新的 goroutine 中執行 doSomething() 函數 |
三、Go的標識符定義
標識符是編程語言中用於識別各種編程元素(如變數、函數、類型等)的名字。在Go語言中,標識符有一組特定的規則和約定。下麵將詳細解析這些規則和特性。
基礎定義
一個標識符是一個以Unicode字母或者下劃線(_
)開頭,並且完全由Unicode字母和Unicode數字組成的單詞。
- Unicode字母:這些是定義在Unicode標準8.0中的Lu、Ll、Lt、Lm和Lo分類中的字元。
- Unicode數字:這些是定義在Unicode標準8.0中的Nd數字字元分類中的字元。
特殊規定
關鍵字與標識符
Go的關鍵字不能被用作標識符。這是一個重要的限制,以避免命名衝突和語法混淆。
空標識符
標識符 _
是一個特殊字元,它被稱為空標識符。它用於忽略函數的某個返回值或強制性聲明一個變數,但不使用。
作用域和可見性
- 導出標識符:一個由Unicode大寫字母開頭的標識符稱為導出標識符,也可以被理解為公開(public)。
- 非導出標識符:其它(即非Unicode大寫字母開頭的)標識符稱為非導出標識符,也可以被理解為私有(private)。
註意:截至目前(Go 1.20),東方字元都被視為非導出字元。
合法標識符示例
導出標識符
Player_9
DoSomething
VERSION
Ĝo
Π
非導出標識符
_
_status
memStat
book
π
一個類型
변수
エラー
非法標識符
- 由Unicode數字開頭:
123
,3apples
- 含有不符合要求的Unicode字元:
a.b
,*ptr
,$name
,[email protected]
- 使用關鍵字:
type
,range
四、Go的標識符舉例
在Go語言中,標識符用於命名各種類型的編程元素,如變數、常量、函數等。本文將通過表格的形式,提供不同類型標識符的代碼示例和相關解釋。
表格:Go標識符類型、示例與解釋
標識符類型 | 標識符示例 | 解釋 |
---|---|---|
變數 | myVariable |
用於存儲數據值。 |
常量 | MAX_COUNT |
用於存儲不會改變的數據值。 |
函數 | CalculateSum |
包含執行特定任務的代碼塊。 |
結構體 | Person |
用於定義包含多個欄位(變數)的複合數據類型。 |
介面 | Writer |
定義了方法集,任何實現了這些方法的類型都被認為實現了該介面。 |
切片 | mySlice |
動態數組,可以在運行時更改大小。 |
Map | colorMap |
鍵值對的集合。 |
Channel | msgChannel |
用於在Goroutine之間發送和接收數據。 |
包 | fmt |
用於組織和復用代碼,通常包含函數、變數、常量等。 |
別名 | type MyInt int |
用於給現有類型創建一個新名字。 |
枚舉 | enum Status |
一組命名的整數常量。 |
Goroutine | go doSomething() |
併發執行的函數。 |
標簽 | LOOP: |
用於控制流語句,如break 和continue 。 |
空標識符 | _ |
用於忽略不需要的值。 |
導出標識符 | PublicVar |
在其他包中可見和可用的標識符。 |
非導出標識符 | privateVar |
僅在定義它的包內可見和可用的標識符。 |
五、Go關鍵詞和標識符代碼實戰
在本部分中,我們將通過一個綜合性的代碼實戰案例來探討Go中所有關鍵詞和標識符的實際應用。我們將創建一個簡單的計算器程式,該程式將實現加、減、乘、除四種操作。
綜合案例:簡單計算器
package main // package關鍵詞用於定義包名
import "fmt" // import關鍵詞用於引入外部包
// 全局變數聲明
var result int // var關鍵詞用於聲明變數
const maxInput = 100 // const關鍵詞用於聲明常量
// 自定義類型聲明
type Calculator func(int, int) int // type關鍵詞用於聲明自定義類型
// 主函數
func main() { // func關鍵詞用於聲明函數
var operator string // 局部變數聲明
var num1, num2 int
for { // for關鍵詞用於迴圈
fmt.Println("請輸入操作符 (+, -, *, /, exit):")
fmt.Scanln(&operator)
if operator == "exit" { // if關鍵詞用於條件判斷
fmt.Println("程式退出。")
break // break關鍵詞用於跳出迴圈
}
fmt.Println("請輸入兩個整數:")
fmt.Scanln(&num1, &num2)
switch operator { // switch關鍵詞用於多條件判斷
case "+":
result = calculate(add, num1, num2)
case "-":
result = calculate(subtract, num1, num2)
case "*":
result = calculate(multiply, num1, num2)
case "/":
if num2 == 0 { // else關鍵詞用於條件判斷
fmt.Println("除數不能為0")
continue // continue關鍵詞用於跳過本次迴圈
}
result = calculate(divide, num1, num2)
default: // default關鍵詞用於多條件預設選項
fmt.Println("無效的操作符")
continue
}
fmt.Printf("結果為: %d\n", result)
}
}
// 函數聲明與定義
func calculate(calc Calculator, num1, num2 int) int {
return calc(num1, num2)
}
// 加法
func add(a, b int) int {
return a + b
}
// 減法
func subtract(a, b int) int {
return a - b
}
// 乘法
func multiply(a, b int) int {
return a * b
}
// 除法
func divide(a, b int) int {
return a / b
}
關鍵詞和標識符解析
package
:定義了當前代碼所屬的包,這裡是main
。import
:用於引入外部庫,這裡我們引入了fmt
庫。var
:全局和局部變數聲明。const
:用於定義常量,這裡定義了一個名為maxInput
的常量。type
:用於聲明自定義類型,這裡定義了一個Calculator
函數類型。func
:用於聲明函數,這裡聲明瞭多個函數。for
:用於迴圈,這裡是一個無限迴圈。if
、else
:用於條件判斷。switch
、case
、default
:用於多條件判斷。break
:用於跳出迴圈。continue
:用於跳過當前迴圈迭代。
關註TechLeadCloud,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智能實驗室成員,阿裡雲認證的資深架構師,項目管理專業人士,上億營收AI產品研發負責人。
如有幫助,請多關註
個人微信公眾號:【TechLeadCloud】分享AI與雲服務研發的全維度知識,談談我作為TechLead對技術的獨特洞察。
TeahLead KrisChang,10+年的互聯網和人工智慧從業經驗,10年+技術和業務團隊管理經驗,同濟軟體工程本科,復旦工程管理碩士,阿裡雲認證雲服務資深架構師,上億營收AI產品業務負責人。