国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
基本結(jié)構(gòu)和使用方式
使用時(shí)容易忽略的點(diǎn)
實(shí)際場(chǎng)景中的常見(jiàn)用法
首頁(yè) 后端開(kāi)發(fā) Golang Go Sync.WaitGroup示例

Go Sync.WaitGroup示例

Jul 09, 2025 am 01:48 AM
go

sync.WaitGroup用于等待一組goroutine完成任務(wù),其核心是通過(guò)Add、Done、Wait三個(gè)方法協(xié)同工作。1. Add(n)設(shè)置需等待的goroutine數(shù)量;2. Done()在每個(gè)goroutine結(jié)束時(shí)調(diào)用,計(jì)數(shù)減一;3. Wait()阻塞主協(xié)程直到所有任務(wù)完成。使用時(shí)需注意:Add應(yīng)在goroutine外調(diào)用、避免重復(fù)Wait、務(wù)必確保Done被調(diào)用,推薦配合defer使用。常見(jiàn)于并發(fā)抓取網(wǎng)頁(yè)、批量數(shù)據(jù)處理等場(chǎng)景,能有效控制并發(fā)流程。

Go sync.WaitGroup example

用 Go 的 sync.WaitGroup 管理并發(fā)任務(wù)其實(shí)挺常見(jiàn)的,尤其是在做多個(gè) goroutine 同步的時(shí)候。簡(jiǎn)單來(lái)說(shuō),它就是一個(gè)計(jì)數(shù)器,用來(lái)等待一組協(xié)程全部完成。

Go sync.WaitGroup example

下面通過(guò)一個(gè)簡(jiǎn)單的例子講清楚怎么用,適合剛接觸并發(fā)編程的朋友。


基本結(jié)構(gòu)和使用方式

WaitGroup 主要有三個(gè)方法:Add(n)、Done()Wait()

Go sync.WaitGroup example
  • Add(n):設(shè)置需要等待的 goroutine 數(shù)量。
  • Done():每個(gè) goroutine 執(zhí)行完后調(diào)用一次,相當(dāng)于計(jì)數(shù)器減一。
  • Wait():阻塞當(dāng)前協(xié)程,直到所有任務(wù)都調(diào)用了 Done()。

舉個(gè)最基礎(chǔ)的例子:

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 3; i   {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            fmt.Printf("goroutine %d start\n", id)
            time.Sleep(time.Second)
            fmt.Printf("goroutine %d done\n", id)
        }(id)
    }

    wg.Wait()
    fmt.Println("All goroutines finished.")
}

這個(gè)例子中啟動(dòng)了三個(gè) goroutine,主函數(shù)會(huì)等它們?nèi)繄?zhí)行完才退出。

Go sync.WaitGroup example

使用時(shí)容易忽略的點(diǎn)

WaitGroup 雖然簡(jiǎn)單,但有些細(xì)節(jié)不注意容易出錯(cuò):

  • Add 在 goroutine 外調(diào)用
    如果你在 goroutine 里面調(diào)用 Add,可能會(huì)導(dǎo)致還沒(méi)加完就執(zhí)行 Wait(),從而提前結(jié)束。

  • 避免重復(fù) Wait
    一個(gè) WaitGroup 不建議復(fù)用,除非你明確重置狀態(tài)。否則第二次調(diào)用 Wait() 可能不會(huì)阻塞。

  • Done 一定要調(diào)用
    忘記調(diào)用 Done(),程序就會(huì)卡死在 Wait() 上。用 defer 是個(gè)好習(xí)慣,確保一定會(huì)執(zhí)行。


實(shí)際場(chǎng)景中的常見(jiàn)用法

有時(shí)候我們會(huì)把 WaitGroup 結(jié)合其他結(jié)構(gòu)一起使用,比如批量處理數(shù)據(jù)或并行請(qǐng)求外部接口。

假設(shè)我們要并發(fā)抓取多個(gè)網(wǎng)頁(yè)內(nèi)容,可以這樣寫(xiě):

urls := []string{"https://example.com/1", "https://example.com/2", ...}

var wg sync.WaitGroup

for _, url := range urls {
    wg.Add(1)
    go func(u string) {
        defer wg.Done()
        // 模擬請(qǐng)求
        resp, err := http.Get(u)
        if err != nil {
            fmt.Println("Error fetching:", u)
            return
        }
        fmt.Println("Fetched:", resp.Status)
    }(u)
}

wg.Wait()

這種模式在爬蟲(chóng)、后臺(tái)任務(wù)處理中很常見(jiàn)。


基本上就這些。掌握好 sync.WaitGroup 的基本用法和注意事項(xiàng),就能很好地控制并發(fā)流程了。

以上是Go Sync.WaitGroup示例的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話題

Laravel 教程
1601
29
PHP教程
1502
276
GO應(yīng)用程序的標(biāo)準(zhǔn)項(xiàng)目布局是什么? GO應(yīng)用程序的標(biāo)準(zhǔn)項(xiàng)目布局是什么? Aug 02, 2025 pm 02:31 PM

答案是:Go應(yīng)用沒(méi)有強(qiáng)制項(xiàng)目布局,但社區(qū)普遍采用一種標(biāo)準(zhǔn)結(jié)構(gòu)以提升可維護(hù)性和擴(kuò)展性。1.cmd/存放程序入口,每個(gè)子目錄對(duì)應(yīng)一個(gè)可執(zhí)行文件,如cmd/myapp/main.go;2.internal/存放私有代碼,不可被外部模塊導(dǎo)入,用于封裝業(yè)務(wù)邏輯和服務(wù);3.pkg/存放可公開(kāi)復(fù)用的庫(kù),供其他項(xiàng)目導(dǎo)入;4.api/可選,存放OpenAPI、Protobuf等API定義文件;5.config/、scripts/、web/分別存放配置文件、腳本和Web資源;6.根目錄包含go.mod和go.sum

您如何在Go中逐行讀取文件? 您如何在Go中逐行讀取文件? Aug 02, 2025 am 05:17 AM

使用bufio.Scanner是Go中逐行讀取文件最常見(jiàn)且高效的方法,適用于處理大文件、日志解析或配置文件等場(chǎng)景。1.使用os.Open打開(kāi)文件并確保通過(guò)deferfile.Close()關(guān)閉文件。2.通過(guò)bufio.NewScanner創(chuàng)建掃描器實(shí)例。3.在for循環(huán)中調(diào)用scanner.Scan()逐行讀取,直到返回false表示到達(dá)文件末尾或出錯(cuò)。4.使用scanner.Text()獲取當(dāng)前行內(nèi)容(不含換行符)。5.循環(huán)結(jié)束后檢查scanner.Err()以捕獲可能的讀取錯(cuò)誤。此方法內(nèi)存效

您如何處理GO Web應(yīng)用程序中的路由? 您如何處理GO Web應(yīng)用程序中的路由? Aug 02, 2025 am 06:49 AM

Go應(yīng)用中的路由選擇取決于項(xiàng)目復(fù)雜度,1.使用標(biāo)準(zhǔn)庫(kù)net/httpServeMux適合簡(jiǎn)單應(yīng)用,無(wú)需外部依賴且輕量,但不支持URL參數(shù)和高級(jí)匹配;2.第三方路由器如Chi提供中間件、路徑參數(shù)和嵌套路由,適合模塊化設(shè)計(jì);3.Gin性能優(yōu)異,內(nèi)置JSON處理和豐富功能,適合API和微服務(wù)。應(yīng)根據(jù)是否需要靈活性、性能或功能集成來(lái)選擇,小型項(xiàng)目用標(biāo)準(zhǔn)庫(kù),中大型項(xiàng)目推薦Chi或Gin,最終實(shí)現(xiàn)從簡(jiǎn)單到復(fù)雜的平滑擴(kuò)展。

您如何在GO中解析命令行旗幟? 您如何在GO中解析命令行旗幟? Aug 02, 2025 pm 04:24 PM

Go的flag包可輕松解析命令行參數(shù),1.使用flag.Type()定義字符串、整型、布爾等類型標(biāo)志;2.可通過(guò)flag.TypeVar()將標(biāo)志解析到變量避免指針操作;3.調(diào)用flag.Parse()后,用flag.Args()獲取后續(xù)位置參數(shù);4.實(shí)現(xiàn)flag.Value接口可支持自定義類型,滿足多數(shù)簡(jiǎn)單CLI需求,復(fù)雜場(chǎng)景可用spf13/cobra庫(kù)替代。

您如何使用諸如if-else in go中的條件語(yǔ)句? 您如何使用諸如if-else in go中的條件語(yǔ)句? Aug 02, 2025 pm 03:16 PM

Go中的if-else語(yǔ)句無(wú)需括號(hào)但必須使用花括號(hào),支持在if中初始化變量以限制作用域,可通過(guò)elseif鏈?zhǔn)脚袛鄺l件,常用于錯(cuò)誤檢查,且變量聲明與條件結(jié)合可提升代碼簡(jiǎn)潔性與安全性。

您如何在Go中宣布常數(shù)? 您如何在Go中宣布常數(shù)? Aug 02, 2025 pm 04:21 PM

在Go中,常量使用const關(guān)鍵字聲明,且值不可更改,可為無(wú)類型或有類型;1.單個(gè)常量聲明如constPi=3.14159;2.塊內(nèi)多個(gè)常量聲明如const(Pi=3.14159;Language="Go";IsCool=true);3.顯式類型常量如constSecondsInMinuteint=60;4.使用iota生成枚舉值,如const(Sunday=iota;Monday;Tuesday)將依次賦值0、1、2,且iota可用于位運(yùn)算等表達(dá)式;常量必須在編譯時(shí)確定值,

Go Run命令做什么? Go Run命令做什么? Aug 03, 2025 am 03:49 AM

gorun是一個(gè)用于快速編譯并執(zhí)行Go程序的命令,1.它在一步中完成編譯和運(yùn)行,生成臨時(shí)可執(zhí)行文件并在程序結(jié)束后刪除;2.適用于包含main函數(shù)的獨(dú)立程序,便于開(kāi)發(fā)和測(cè)試;3.支持多文件運(yùn)行,可通過(guò)gorun*.go或列出所有文件執(zhí)行;4.自動(dòng)處理依賴,利用模塊系統(tǒng)解析外部包;5.不適用于庫(kù)或包,且不生成持久化二進(jìn)制文件,因此適合腳本、學(xué)習(xí)和頻繁修改時(shí)的快速測(cè)試,是一種高效、簡(jiǎn)潔的即時(shí)運(yùn)行方式。

如何在GO中連接到SQL數(shù)據(jù)庫(kù)? 如何在GO中連接到SQL數(shù)據(jù)庫(kù)? Aug 03, 2025 am 09:31 AM

要連接Go中的SQL數(shù)據(jù)庫(kù),需使用database/sql包和特定數(shù)據(jù)庫(kù)驅(qū)動(dòng)。1.導(dǎo)入database/sql包和驅(qū)動(dòng)(如github.com/go-sql-driver/mysql),注意驅(qū)動(dòng)前加下劃線表示僅用于初始化;2.使用sql.Open("mysql","user:password@tcp(localhost:3306)/dbname")創(chuàng)建數(shù)據(jù)庫(kù)句柄,并調(diào)用db.Ping()驗(yàn)證連接;3.使用db.Query()執(zhí)行查詢,db.Exec()執(zhí)行

See all articles