Go 語言 bufio 包入門:10 分鐘掌握高性能 I-O 操作

大家好,今天我們來聊一個 Go 語言中非常實用的包 - bufio。不管你是剛入門的新手還是有經驗的開發者,這篇文章都能幫你快速掌握 bufio 的使用!

🌟 什麼是 bufio?

bufio 是 Go 語言提供的一個帶緩衝的 I/O 包,它像是給 I/O 操作加了一個 "加速器",通過減少系統調用次數來提升性能。

想象一下:

💡 爲什麼要使用 bufio?

  1. 提升性能:減少系統調用次數

  2. 提供便利:更簡單的 API

  3. 更好的效率:批量讀寫數據

📊 應用場景

  1. 文件操作
  1. 用戶交互
  1. 數據處理

🚀 實戰案例

🌟 示例 1:基礎文件讀取

package main
import (
    "bufio"
    "fmt"
    "os"
)
func main() {
    // 打開文件
    file, err := os.Open("test.txt")
    if err != nil {
        fmt.Println("無法打開文件:", err)
        return
    }
    defer file.Close()
    // 創建reader
    reader := bufio.NewReader(file)
    // 逐行讀取
    for {
        line, err := reader.ReadString('\n')
        if err != nil {
            break
        }
        fmt.Print(line)
    }
}

👉 這個例子展示瞭如何使用 bufio.Reader 逐行讀取文件,適合處理文本文件。

🌟 示例 2. 簡單的文件寫入

package main
import (
  "bufio"
  "fmt"
  "os"
)
func main() {
  // 創建文件
  file, err := os.Create("output.txt")
  if err != nil {
    fmt.Println("無法創建文件:", err)
    return
  }
  defer file.Close()
  // 創建writer
  writer := bufio.NewWriter(file)
  // 寫入數據
  _, _ = writer.WriteString("Hello, World!\n")
  _, _ = writer.WriteString("這是第二行\n")
  // 記得調用Flush
  _ = writer.Flush()
}

👉 這個例子展示瞭如何使用 bufio.Writer 寫入文件,注意最後要調用 Flush 確保數據寫入。

🌟 示例 3. 控制檯輸入讀取

package main
import (
  "bufio"
  "fmt"
  "os"
)
func main() {
  reader := bufio.NewReader(os.Stdin)
  fmt.Print("請輸入你的名字: ")
  name, _ := reader.ReadString('\n')
  fmt.Printf("你好, %s", name)
}

👉 這個例子展示瞭如何讀取用戶的控制檯輸入,很適合做命令行工具。

🌟 示例 4. 按單詞讀取

package main
import (
  "bufio"
  "fmt"
  "strings"
)
func main() {
  text := "hello world golang"
  reader := bufio.NewScanner(strings.NewReader(text))
  // 設置分詞方式爲按單詞
  reader.Split(bufio.ScanWords)
  // 遍歷所有單詞
  for reader.Scan() {
    fmt.Println(reader.Text())
  }
}

👉 這個例子展示瞭如何使用 Scanner 按單詞讀取文本。

🌟 示例 5. 簡單的日誌寫入器

package main
import (
  "bufio"
  "fmt"
  "os"
  "time"
)
func main() {
  // 打開日誌文件
  file, _ := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
  defer file.Close()
  writer := bufio.NewWriter(file)
  defer writer.Flush()
  // 寫入日誌
  message := fmt.Sprintf("[%s] 程序啓動\n", time.Now().Format("2006-01-02 15:04:05"))
  writer.WriteString(message)
}

👉 這個例子實現了一個簡單的日誌寫入功能。

🌟 示例 6. 複製文件

package main
import (
  "bufio"
  "fmt"
  "io"
  "os"
)
func main() {
  // 打開源文件
  source, _ := os.Open("source.txt")
  defer source.Close()
  // 創建目標文件
  dest, _ := os.Create("dest.txt")
  defer dest.Close()
  // 創建帶緩衝的reader和writer
  reader := bufio.NewReader(source)
  writer := bufio.NewWriter(dest)
  defer writer.Flush()
  // 複製文件內容
  io.Copy(writer, reader)
  fmt.Println("文件複製完成!")
}

👉 這個例子展示瞭如何使用 bufio 實現文件複製功能。

🎁 總結

bufio 包雖然簡單,但是功能強大,是 Go 語言 I/O 操作中的必備工具:

記住:

  1. Reader 用於讀取數據

  2. Writer 用於寫入數據

  3. 使用 Writer 後要 Flush

  4. 要做好錯誤處理

掌握了 bufio,你的 Go 程序性能會有顯著提升!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/WAD10BWizCLX40uQASZvIg