Skip to content

數據結構

Go 語言雖然語法簡潔,但內置了多種功能強大的核心數據結構。這些數據結構是 Go 程序的基礎構建塊,深入理解它們的實現原理,有助於編寫更高效的代碼。本文將介紹 Go 中最常用的幾種數據結構及其底層實現。

基礎數據結構

slice 切片

切片是 Go 語言中最常用的數據結構,是對數組的抽象和封裝。主要特點:

  • 動態大小:切片的長度可以動態增長
  • 引用語義:切片傳遞時只復制結構體,不復制底層數組
  • 擴容機制:當容量不足時會自動擴容

切片在運行時由 slice 結構體表示,包含指向底層數組的指針、長度和容量三個字段。

string 字符串

字符串是 Go 中最基礎的數據類型之一,主要特點:

  • 不可變性:字符串一旦創建就不能修改
  • UTF-8 編碼:通常表示 UTF-8 編碼的文本
  • 零值安全:字符串的零值是空字符串 "",而非 nil

字符串在運行時由 stringStruct 結構體表示,包含指向字節數組的指針和長度。

容器數據結構

map 映射表

map 是 Go 語言內置的鍵值對容器,底層采用哈希表實現。主要特點:

  • 哈希表實現:通過哈希函數快速定位元素
  • 自動擴容:當負載因子過高時自動進行擴容
  • 非並發安全:並發讀寫需要額外的同步機制

map 在運行時由 hmap 結構體表示,包含桶數組、哈希種子、元素計數等字段。

syncmap 並發映射

sync.Map 是標准庫提供的並發安全映射,適用於讀多寫少的場景。主要特點:

  • 讀寫分離:使用 read 和 dirty 兩個 map 實現讀寫分離
  • 原子操作:read map 使用原子操作,無需加鎖
  • 漸進遷移:miss 計數達到閾值時將 dirty 提升為 read

sync.Map 通過空間換時間的方式,在特定場景下提供了比 map + mutex 更好的性能。

並發數據結構

channel 通道

channel 是 Go 語言貫徹 CSP 思想的典型代表,用於協程間通信。主要特點:

  • 協程通信:通過 channel 實現協程間的數據傳遞
  • 同步機制:無緩沖 channel 可用於協程同步
  • 有鎖隊列:底層是帶鎖的環形隊列

channel 在運行時由 hchan 結構體表示,包含環形緩沖區、等待隊列等字段。

select 多路復用

select 可以同時監聽多個 channel 的狀態,實現多路復用。主要特點:

  • 非阻塞:可以非阻塞地檢查多個 channel 是否可用
  • 隨機選擇:多個 channel 同時可用時隨機選擇一個執行
  • 超時控制:配合 time.After 實現超時機制

select 在運行時由 scase 結構體表示每個分支,通過輪詢機制檢查 channel 狀態。

學習建議

建議按照以下順序學習:

  1. 先學習 slice 切片string 字符串,理解基礎數據結構
  2. 再學習 map 映射表,了解哈希表的實現
  3. 然後學習 channel 通道,理解協程通信機制
  4. 接著學習 select 多路復用,掌握多路復用技巧
  5. 最後學習 syncmap 並發映射,了解並發安全的實現方式

Golang學習網由www.golangdev.cn整理維護