Go by Example ไธญๆ–‡็‰ˆ: ้€š้“ๅŒๆญฅ

ๆˆ‘ไปฌๅฏไปฅไฝฟ็”จ้€š้“ๆฅๅŒๆญฅๅ็จ‹ไน‹้—ด็š„ๆ‰ง่กŒ็Šถๆ€ใ€‚ ่ฟ™ๅ„ฟๆœ‰ไธ€ไธชไพ‹ๅญ๏ผŒไฝฟ็”จ้˜ปๅกžๆŽฅๆ”ถ็š„ๆ–นๅผ๏ผŒๅฎž็Žฐไบ†็ญ‰ๅพ…ๅฆไธ€ไธชๅ็จ‹ๅฎŒๆˆใ€‚ ๅฆ‚ๆžœ้œ€่ฆ็ญ‰ๅพ…ๅคšไธชๅ็จ‹๏ผŒWaitGroup ๆ˜ฏไธ€ไธชๆ›ดๅฅฝ็š„้€‰ๆ‹ฉใ€‚

package main
import (
    "fmt"
    "time"
)

ๆˆ‘ไปฌๅฐ†่ฆๅœจๅ็จ‹ไธญ่ฟ่กŒ่ฟ™ไธชๅ‡ฝๆ•ฐใ€‚ done ้€š้“ๅฐ†่ขซ็”จไบŽ้€š็Ÿฅๅ…ถไป–ๅ็จ‹่ฟ™ไธชๅ‡ฝๆ•ฐๅทฒ็ปๅฎŒๆˆๅทฅไฝœใ€‚

func worker(done chan bool) {
    fmt.Print("working...")
    time.Sleep(time.Second)
    fmt.Println("done")

ๅ‘้€ไธ€ไธชๅ€ผๆฅ้€š็Ÿฅๆˆ‘ไปฌๅทฒ็ปๅฎŒๅทฅๅ•ฆใ€‚

    done <- true
}
func main() {

่ฟ่กŒไธ€ไธช worker ๅ็จ‹๏ผŒๅนถ็ป™ไบˆ็”จไบŽ้€š็Ÿฅ็š„้€š้“ใ€‚

    done := make(chan bool, 1)
    go worker(done)

็จ‹ๅบๅฐ†ไธ€็›ด้˜ปๅกž๏ผŒ็›ด่‡ณๆ”ถๅˆฐ worker ไฝฟ็”จ้€š้“ๅ‘้€็š„้€š็Ÿฅใ€‚

    <-done
}
$ go run channel-synchronization.go
working...done

ๅฆ‚ๆžœไฝ ๆŠŠ <- done ่ฟ™่กŒไปฃ็ ไปŽ็จ‹ๅบไธญ็งป้™ค๏ผŒ ็จ‹ๅบ็”š่‡ณๅฏ่ƒฝๅœจ worker ๅผ€ๅง‹่ฟ่กŒๅ‰ๅฐฑ็ป“ๆŸไบ†ใ€‚

ไธ‹ไธ€ไธชไพ‹ๅญ: ้€š้“ๆ–นๅ‘