langShift

Go 語言介紹

Go 語言歷史與設計哲學

Go(也稱為 Golang)是由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 設計的靜態類型編譯型程式語言。它創建於 2007 年,並於 2009 年正式發布。Go 的設計目的是解決現代軟體開發中的挑戰,特別是在大規模分散式系統和雲端運算環境中。

Go 的設計哲學強調:

  • 簡潔性:乾淨、可讀的語法,關鍵字最少
  • 並發性:內建對並發程式設計的支援,透過 goroutines 和 channels
  • 效能:快速編譯和高效執行
  • 安全性:強類型系統和記憶體安全,無需垃圾回收開銷
  • 生產力:快速開發週期,內建工具和測試

與 JavaScript 的概覽對比

特性JavaScriptGo
程式設計範式多範式(函數式、物件導向、事件驅動)多範式(程序式、並發、物件導向)
類型系統動態類型,弱類型靜態類型,強類型
執行方式解釋執行(瀏覽器/Node.js 中 JIT 編譯)編譯執行
記憶體管理自動(垃圾回收)自動(垃圾回收)
並發處理事件驅動,async/await,Promises內建 goroutines 和 channels
效能相對較慢(解釋執行/GC)快速(編譯執行,高效 GC)
應用場景Web 開發、行動應用、桌面應用系統程式設計、微服務、雲原生、Web 服務

編譯型 vs 解釋型語言

JavaScript(解釋型/JIT 編譯): JavaScript 程式碼通常由解釋器執行(如瀏覽器的 JavaScript 引擎或 Node.js)。雖然現代 JavaScript 引擎使用即時(JIT)編譯在執行時將程式碼轉換為機器碼以提高效能,但其核心特徵是程式碼不會預先編譯成獨立的可執行檔案。

Go(編譯型): Go 程式碼必須在執行前編譯成機器碼。這個過程包括:

  1. 解析:Go 編譯器將原始碼解析為抽象語法樹(AST)
  2. 類型檢查:靜態類型分析和語義驗證
  3. 編譯:將 Go 程式碼轉換為機器碼
  4. 連結:將編譯後的程式碼和依賴項組合成單個可執行檔案

Go 的編譯速度極快,即使對於大型專案也只需要幾秒鐘,這使得它在開發速度方面感覺更像解釋型語言。

Go 應用場景和優勢

應用場景:

  • 微服務:高效能、可擴展的微服務架構
  • 雲原生開發:Kubernetes、Docker 和雲端平台開發
  • Web 服務:RESTful API、GraphQL 服務和 Web 應用
  • 系統程式設計:網路服務、系統工具和實用程式
  • DevOps 工具:CI/CD 流水線、監控工具和自動化腳本
  • 高效能運算:並發資料處理和即時系統

優勢:

  • 並發性:內建 goroutines 和 channels,便於並發程式設計
  • 效能:快速編譯和高效執行
  • 簡潔性:乾淨的語法和最小的學習曲線
  • 標準庫:豐富的標準庫,包含網路、HTTP 和測試功能
  • 跨平台:單一二進制檔案部署到不同平台
  • 工具鏈:優秀的內建工具(go fmt、go test、go mod 等)
  • 雲原生:專為現代雲端和容器環境設計

開發環境設定

要編寫和執行 Go 程式碼,你需要:

  1. Go 安裝:從官方網站下載並安裝 Go
  2. 文字編輯器或 IDE:Visual Studio Code、GoLand、Vim 或任何支援 Go 的文字編輯器
  3. Go 模組:現代依賴管理(Go 1.11+)

安裝說明:

# 從 https://golang.org/dl/ 下載 Go
# macOS(使用 Homebrew)
brew install go
# Ubuntu/Debian
sudo apt update
sudo apt install golang-go
# Windows
# 從 golang.org/dl/ 下載 MSI 安裝程式

驗證安裝:

go version
# 應該輸出:go version go1.21.x darwin/amd64(或類似)

設定 Go 工作空間:

# 為你的 Go 專案建立目錄
mkdir ~/go
cd ~/go
# 初始化新模組
go mod init myproject

你的第一個 Go 程式

讓我們編寫一個簡單的 "Hello, World!" Go 程式。

正在加载...

編譯和執行過程

要編譯和執行 Go "Hello, World!" 程式(假設你將其儲存為 hello.go):

  1. 直接執行(開發推薦):

    go run hello.go

    這一步編譯並執行程式,非常適合開發。

  2. 建置可執行檔案:

    go build hello.go

    這會建立一個名為 hello 的可執行檔案(Windows 上為 hello.exe)。

  3. 執行可執行檔案:

    ./hello # Unix 類系統
    hello.exe # Windows

Go 模組系統

Go 使用模組進行依賴管理。以下是設定新專案的方法:

# 為你的專案建立新目錄
mkdir my-go-project
cd my-go-project
# 初始化新模組
go mod init my-go-project
# 這會建立一個追蹤依賴項的 go.mod 檔案

go.mod 檔案範例:

module my-go-project
go 1.21
require (
github.com/gin-gonic/gin v1.9.1
github.com/go-sql-driver/mysql v1.7.1
)

Go 工具鏈

Go 提供了優秀的內建工具:

  • go run:編譯並執行 Go 程式
  • go build:將 Go 程式編譯為可執行檔案
  • go test:執行測試
  • go fmt:格式化 Go 程式碼
  • go mod:管理依賴項
  • go get:下載並安裝包
  • go vet:分析程式碼中的潛在問題
  • go doc:產生文件

JavaScript 開發者需要了解的關鍵 Go 概念

1. 包和匯入:

package main // 宣告包
import (
"fmt" // 標準庫包
"strings" // 另一個標準庫包
)

2. 函數:

func add(a, b int) int {
return a + b
}

3. 變數和類型:

var name string = "Go"
age := 25 // 短變數宣告(類型推斷)

4. 並發(Go 的超能力):

go func() {
// 這會並發執行
fmt.Println("在 goroutine 中執行")
}()

練習題:

  1. Go 和 JavaScript 在執行模型方面的主要區別是什麼?
  2. 列出 Go 比 JavaScript 更優選的三個常見應用領域,並解釋原因。
  3. 描述設定 Go 開發環境涉及的步驟。
  4. go rungo build 之間有什麼區別?

專案想法:

  • 在 Go 中建立一個簡單的 HTTP 伺服器,提供 "Hello, World!" 訊息,並與 Node.js 等效版本進行比較。

下一步:

  • 學習 Go 的語法以及它與 JavaScript 的比較
  • 理解 Go 的類型系統和介面
  • 探索 Go 強大的並發特性:goroutines 和 channels