Go,從命名開始!Go的關鍵字和識別符號全列表手冊和程式碼範例!

2023-09-06 12:00:15

關注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: 用於控制流語句,如breakcontinue
空識別符號 _ 用於忽略不需要的值。
匯出識別符號 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:用於迴圈,這裡是一個無限迴圈。
  • ifelse:用於條件判斷。
  • switchcasedefault:用於多條件判斷。
  • break:用於跳出迴圈。
  • continue:用於跳過當前回圈迭代。

關注TechLeadCloud,分享網際網路架構、雲服務技術的全維度知識。作者擁有10+年網際網路服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智慧實驗室成員,阿里雲認證的資深架構師,專案管理專業人士,上億營收AI產品研發負責人。
如有幫助,請多關注
個人微信公眾號:【TechLeadCloud】分享AI與雲服務研發的全維度知識,談談我作為TechLead對技術的獨特洞察。
TeahLead KrisChang,10+年的網際網路和人工智慧從業經驗,10年+技術和業務團隊管理經驗,同濟軟體工程本科,復旦工程管理碩士,阿里雲認證雲服務資深架構師,上億營收AI產品業務負責人。