快轉到主要內容
  1. Go 基礎入門/

Channel

目錄
Go基礎入門 - 系列文
15: ➫

15: 本節課說明channel,是 Go 並行處理的核心元素。

什麼是Channel
#

  • Channel是Go語言中一種特殊的數據類型,用於在Goroutines之間傳遞數據。
  • 它類似於一個數據流管道:數據在一端進入,在另一端被取出。

基本操作與宣告
#

  • 宣告一個Channel通常用chan關鍵字,例如c1 := make(chan int)
  • make函式用於初始化Channel,可指定數據類型和選擇性的緩衝區大小。

緩衝區與阻塞
#

  • 無緩衝區的Channel在數據傳輸時會阻塞,直到另一端準備好接收。
  • 有緩衝區的Channel允許數據存儲在緩衝區中,減少阻塞的發生。

數據傳輸
#

  • 數據的傳輸使用<-操作符,例如c1 <- 1將數字1發送到Channel c1

接收與關閉
#

  • 使用<-操作符接收數據,如value := <-c1
  • 使用close函式可以關閉Channel,防止發生死鎖。

Channel與Goroutine的結合使用
#

  • Channel經常與Goroutine結合使用,以實現並發處理。
  • 使用select-case結構可有效管理多個Channel的讀寫操作。

實際範例:網絡請求處理器
#

這個範例展示了如何使用Channel和Goroutine來並行處理多個網絡請求。每個請求都在自己的Goroutine中運行,並將響應時間發送到共享的Channel。

package main

import (
	"fmt"
	"net/http"
	"time"
)

func fetchURL(url string, ch chan<- string) {
	start := time.Now()
	resp, err := http.Get(url)
	if err != nil {
		ch <- fmt.Sprint(err)
		return
	}
	defer resp.Body.Close()
	ch <- fmt.Sprintf("%s responded in %v", url, time.Since(start))
}

func main() {
	urls := []string{
		"https://www.google.com",
		"https://www.facebook.com",
		"https://www.amazon.com",
	}

	ch := make(chan string)

	for _, url := range urls {
		go fetchURL(url, ch)
	}

	for range urls {
		fmt.Println(<-ch)
	}
}

Channel作為Goroutines間的溝通管道,進行數據傳輸、管理阻塞和緩衝區,特別是在處理並行任務,如網絡請求時,Channel的使用顯得尤為重要,也為寫出更高效、更可靠的Go應用程序奠定了基礎。

Go基礎入門 - 系列文
15: ➫

相關文章

互斥鎖
16: 本節課說明 Go 的sync套件提供並發編程中的同步機制與資源管理工具。
單元測試
17: 本節課說明 Go 單元測試的基本概念、執行方法,並介紹基準測試來評估程式性能。