首頁 > 後端開發 > Golang > 主體

Go語言核心技術解析

WBOY
發布: 2024-04-03 17:15:01
原創
1087 人瀏覽過

Go中並發程式設計利用goroutine(輕量級執行緒)和channel(通訊管道)實現。 goroutine透過go關鍵字創建,非常輕量,可創建大量goroutine,且不會影響效能。 channel用於goroutine間通信,是類型化的管道。本例展示了併發爬蟲的應用,使用goroutine並行爬取URL,提高效率。

Go語言核心技術解析

Go 核心技術解析:並發程式設計

Go 中的並發模型是基於goroutine(輕量級執行緒)和channel(通訊管道)的概念。透過充分利用這些特性,開發者可以建立高並發、高效能的應用程式。

Goroutine

Goroutine 是 Go 中的輕量級線程,由關鍵字 go 建立。它們在協程調度器上運行,與傳統線程不同,goroutine 非常輕量,可以創建數千個而不會對性能造成重大影響。以下程式碼展示如何建立和使用 goroutine:

package main

import (
    "fmt"
    "runtime"
)

func main() {
    fmt.Printf("Number of goroutines: %d\n", runtime.NumGoroutine()) // 当前正在运行的 goroutine 数量

    // 创建一个 goroutine
    go func() {
        fmt.Println("Hello from a goroutine!")
    }()

    fmt.Printf("Number of goroutines: %d\n", runtime.NumGoroutine()) // 当前正在运行的 goroutine 数量
}
登入後複製

Channel

#Channel 是用於 goroutine 之間通訊的管道。它們是類型化的,這意味著它們只能傳遞特定類型的值。以下程式碼展示如何建立和使用channel:

package main

import (
    "fmt"
)

func main() {
    // 创建一个 int 类型的 channel
    c := make(chan int)

    // 向 channel 发送值
    go func() {
        c <- 42
    }()

    // 从 channel 接收值
    v := <-c
    fmt.Println(v) // 输出:42
}
登入後複製

實戰案例:並發爬蟲

以下是使用goroutine 和channel 建立並發爬蟲的簡化範例:

package main

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

var wg sync.WaitGroup

func main() {
    // 要爬取的 URL 列表
    urls := []string{
        "https://example.com",
        "https://example2.com",
        "https://example3.com",
    }

    // 创建 channel 来接收每个 URL 的响应
    results := make(chan string)

    // 为每个 URL 创建一个 goroutine
    for _, url := range urls {
        wg.Add(1)
        go func(url string) {
            resp, err := http.Get(url)
            if err != nil {
                fmt.Printf("Error fetching %s: %v\n", url, err)
            } else if resp.StatusCode == 200 {
                results <- url
            }
            wg.Done()
        }(url)
    }

    // 从 channel 中获取响应
    go func() {
        for url := range results {
            fmt.Println(url)
        }
    }()

    // 等待所有 goroutine 完成
    wg.Wait()
}
登入後複製

透過使用goroutine 和channel,此爬蟲可以並發爬取多個URL,從而提高了效率。

以上是Go語言核心技術解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板