最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang 并發(fā)編程入門Goroutine 簡介與基礎用法小結

 更新時間:2024年11月13日 12:05:08   作者:Linke-  
Goroutine 是 Golang 中的一種輕量級線程,用于實現(xiàn)并發(fā)操作,與傳統(tǒng)線程相比,Goroutine 的優(yōu)勢在于它具有更低的資源消耗和更高的效率,本文介紹Golang 并發(fā)編程入門Goroutine 簡介與基礎用法小結,感興趣的朋友一起看看吧

一、什么是 Goroutine?

Goroutine 是 Golang 中的一種輕量級線程,用于實現(xiàn)并發(fā)操作。與傳統(tǒng)線程相比,Goroutine 的優(yōu)勢在于它具有更低的資源消耗和更高的效率。每個 Goroutine 在運行時被 Go 的調(diào)度器(Scheduler)管理,并且它們共享內(nèi)存空間。這使得在單個系統(tǒng)線程上運行成千上萬個 Goroutine 成為可能。

1、Goroutine 的特點:

  • 輕量級:內(nèi)存開銷非常小,大約只需 2KB。
  • 非搶占式調(diào)度:Goroutine 自愿讓出 CPU,通過協(xié)作完成任務切換。
  • 并發(fā)與并行:Goroutine 提供并發(fā)模型,多個任務可以同時進行。
  • 阻塞模型簡化開發(fā):避免了復雜的回調(diào)函數(shù),使代碼結構更加簡潔。

二、如何啟動 Goroutine

要啟動 Goroutine,我們只需要在函數(shù)調(diào)用前加上 go 關鍵字。此操作會將該函數(shù)在單獨的 Goroutine 中異步執(zhí)行,主程序不會等待它完成。

語法:

go 函數(shù)名(參數(shù))

示例 1:基本的 Goroutine 用法

package main
import (
    "fmt"
    "time"
)
func printMessage() {
    fmt.Println("Goroutine is running!")
}
func main() {
    go printMessage() // 啟動 Goroutine
    time.Sleep(1 * time.Second) // 暫停主線程,確保 Goroutine 執(zhí)行完
    fmt.Println("Main function is done.")
}

輸出:

Goroutine is running!  
Main function is done.

解釋:

  • 主 Goroutine(即 main 函數(shù))立即啟動了一個子 Goroutine 來運行 printMessage 函數(shù)。
  • 如果沒有 time.Sleep,主 Goroutine 可能會在子 Goroutine 還未執(zhí)行時結束,導致沒有輸出。

三、主 Goroutine 與子 Goroutine 的關系

  • 主 Goroutinemain 函數(shù)所在的 Goroutine,程序從這里開始運行。
  • 子 Goroutine:由主 Goroutine 或其他 Goroutine 創(chuàng)建的 Goroutine。

關鍵點:如果主 Goroutine 結束,所有未完成的子 Goroutine 也會被強制終止。

示例 2:主線程結束導致子 Goroutine 終止

package main
import (
    "fmt"
    "time"
)
func main() {
    go func() {
        time.Sleep(2 * time.Second)
        fmt.Println("This message may never appear.")
    }()
    fmt.Println("Main function is done.")
    // 主 Goroutine 立即結束,子 Goroutine 沒有機會完成
}

輸出:

Main function is done.

解釋:

主 Goroutine 結束時,所有未完成的子 Goroutine 會立即停止,因此不會看到子 Goroutine 的輸出。

四、Goroutine 的參數(shù)傳遞

在 Golang 中,Goroutine 支持傳遞參數(shù),但需要注意是按值傳遞,而不是按引用。

示例 3:Goroutine 傳遞參數(shù)

package main
import (
    "fmt"
)
func printNumber(num int) {
    fmt.Println("Number:", num)
}
func main() {
    for i := 1; i <= 3; i++ {
        go printNumber(i) // 啟動 Goroutine 傳遞參數(shù)
    }
    fmt.Scanln() // 等待用戶輸入,防止程序提前結束
}

輸出(可能):

Number: 1  
Number: 2  
Number: 3

五、匿名函數(shù)中的變量捕獲問題

Goroutine 常與匿名函數(shù)一起使用,但要小心變量捕獲問題。在循環(huán)中啟動 Goroutine 時,匿名函數(shù)可能捕獲的不是當前迭代變量的值,而是循環(huán)結束后的變量。

示例 4:錯誤的變量捕獲

package main
import (
    "fmt"
    "time"
)
func main() {
    for i := 1; i <= 3; i++ {
        go func() {
            fmt.Println(i) // 捕獲的可能是循環(huán)結束后的 i
        }()
    }
    time.Sleep(1 * time.Second)
}

輸出:

4  
4  
4

修改后的代碼:將變量作為參數(shù)傳遞

go func(n int) {
    fmt.Println(n)
}(i)

六、使用 WaitGroup 等待 Goroutine 完成

time.Sleep 不是等待 Goroutine 完成的最佳方式。Go 提供了 sync.WaitGroup 來管理多個 Goroutine 的同步。

示例 5:使用 WaitGroup

package main
import (
    "fmt"
    "sync"
)
func printMessage(msg string, wg *sync.WaitGroup) {
    defer wg.Done() // Goroutine 完成時調(diào)用 Done()
    fmt.Println(msg)
}
func main() {
    var wg sync.WaitGroup
    wg.Add(3) // 等待 3 個 Goroutine
    go printMessage("Hello", &wg)
    go printMessage("from", &wg)
    go printMessage("Goroutine!", &wg)
    wg.Wait() // 等待所有 Goroutine 完成
    fmt.Println("All Goroutines are done.")
}

輸出:

Hello  
from  
Goroutine!  
All Goroutines are done.

解釋:

  • wg.Add(n) 表示需要等待 n 個 Goroutine 完成。
  • 每個 Goroutine 結束時調(diào)用 wg.Done()。
  • wg.Wait() 會阻塞主 Goroutine,直到所有任務完成。

七、Goroutine 的典型應用場景

  • I/O 并發(fā):處理大量網(wǎng)絡請求,減少響應時間。
  • 后臺任務:執(zhí)行定時任務、日志記錄等。
  • 并行計算:分布計算任務,提高程序性能。
  • 定時器與延時操作:如每隔一段時間執(zhí)行某個操作。

八、注意事項與最佳實踐

  • 避免死鎖:當 Goroutine 等待彼此時可能出現(xiàn)死鎖,應小心處理共享資源。
  • 合理使用 WaitGroup 和 Channel:確保 Goroutine 的同步與通信。
  • 避免啟動過多 Goroutine:雖然 Goroutine 輕量,但過多的 Goroutine 也會占用系統(tǒng)資源。
  • 調(diào)試工具:使用 go tool tracepprof 進行性能調(diào)優(yōu)和調(diào)試。

九、小結

Goroutine 是 Golang 的強大并發(fā)工具,其高效、易用的特點讓它成為開發(fā)者實現(xiàn)并發(fā)程序的首選。在這篇博客中,我們介紹了 Goroutine 的基礎用法、參數(shù)傳遞和同步機制,并演示了常見的應用場景和注意事項。

到此這篇關于Golang 并發(fā)編程入門:Goroutine 簡介與基礎用法的文章就介紹到這了,更多相關goland goroutine用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • go語言的工作空間和GOPATH環(huán)境變量介紹

    go語言的工作空間和GOPATH環(huán)境變量介紹

    這篇文章主要介紹了go語言的工作空間和GOPATH環(huán)境變量介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang清空數(shù)組的兩種方法小結

    golang清空數(shù)組的兩種方法小結

    Go數(shù)組固定長度無法直接清空,可通過切片或循環(huán)置零實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-06-06
  • Golang map與sync.map的異同詳解

    Golang map與sync.map的異同詳解

    在Go語言中,map和sync.Map都是用于存儲鍵值對的數(shù)據(jù)結構,但它們在并發(fā)安全性、性能和使用場景上存在顯著差異,接下來將深入探討這兩種數(shù)據(jù)結構的異同,感興趣的朋友可以參考下
    2024-01-01
  • Go語言實現(xiàn)字符串切片賦值的方法小結

    Go語言實現(xiàn)字符串切片賦值的方法小結

    這篇文章主要給大家介紹了Go語言實現(xiàn)字符串切片賦值的兩種方法,分別是在for循環(huán)的range中以及在函數(shù)的參數(shù)傳遞中實現(xiàn),有需要的朋友們可以根據(jù)自己的需要選擇使用。下面來一起看看吧。
    2016-10-10
  • 對Golang中的FORM相關字段理解

    對Golang中的FORM相關字段理解

    這篇文章主要介紹了對Golang中的FORM相關字段理解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • 淺談golang類型斷言,失敗類型斷言返回值問題

    淺談golang類型斷言,失敗類型斷言返回值問題

    這篇文章主要介紹了淺談golang類型斷言,失敗類型斷言返回值問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言中的延遲函數(shù)defer示例詳解

    Go語言中的延遲函數(shù)defer示例詳解

    眾所周知golang的defer優(yōu)雅又簡潔, 是golang的亮點之一。所以下面這篇文章主要給大家介紹了關于Go語言中延遲函數(shù)defer的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-10-10
  • Golang實現(xiàn)獲取系統(tǒng)環(huán)境變量的方法詳解

    Golang實現(xiàn)獲取系統(tǒng)環(huán)境變量的方法詳解

    這篇文章主要為大家詳細介紹了Golang實現(xiàn)獲取系統(tǒng)環(huán)境變量的相關方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2026-04-04
  • Go底層之singleflight包原理分析

    Go底層之singleflight包原理分析

    這篇文章主要介紹了Go底層之singleflight包原理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • golang接口實現(xiàn)調(diào)用修改(值接收者指針接收者)場景詳解

    golang接口實現(xiàn)調(diào)用修改(值接收者指針接收者)場景詳解

    這篇文章主要為大家介紹了golang接口實現(xiàn)調(diào)用修改值接收者指針接收者示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08

最新評論

四川省| 韩城市| 高淳县| 栾川县| 罗定市| 祁门县| 聊城市| 会同县| 德昌县| 确山县| 罗甸县| 阿拉善左旗| 马关县| 东辽县| 岳池县| 临江市| 中牟县| 台江县| 囊谦县| 喀喇| 阿鲁科尔沁旗| 墨玉县| 宣恩县| 龙口市| 德安县| 肇东市| 贺兰县| 登封市| 嘉义县| 沙河市| 巴南区| 阿拉善左旗| 玉溪市| 四平市| 富民县| 合肥市| 罗江县| 嵊州市| 东乡族自治县| 工布江达县| 洛阳市|