Go by Example ไธญๆ–‡็‰ˆ: ้€š้“้€‰ๆ‹ฉๅ™จ

Go ็š„ ้€‰ๆ‹ฉๅ™จ๏ผˆselect๏ผ‰ ่ฎฉไฝ ๅฏไปฅๅŒๆ—ถ็ญ‰ๅพ…ๅคšไธช้€š้“ๆ“ไฝœใ€‚ ๅฐ†ๅ็จ‹ใ€้€š้“ๅ’Œ้€‰ๆ‹ฉๅ™จ็ป“ๅˆ๏ผŒๆ˜ฏ Go ็š„ไธ€ไธชๅผบๅคง็‰นๆ€งใ€‚

package main
import (
    "fmt"
    "time"
)
func main() {

ๅœจ่ฟ™ไธชไพ‹ๅญไธญ๏ผŒๆˆ‘ไปฌๅฐ†ไปŽไธคไธช้€š้“ไธญ้€‰ๆ‹ฉใ€‚

    c1 := make(chan string)
    c2 := make(chan string)

ๅ„ไธช้€š้“ๅฐ†ๅœจไธ€ๅฎšๆ—ถ้—ดๅŽๆŽฅๆ”ถไธ€ไธชๅ€ผ๏ผŒ ้€š่ฟ‡่ฟ™็งๆ–นๅผๆฅๆจกๆ‹Ÿๅนถ่กŒ็š„ๅ็จ‹ๆ‰ง่กŒ๏ผˆไพ‹ๅฆ‚๏ผŒRPC ๆ“ไฝœ๏ผ‰ๆ—ถ้€ ๆˆ็š„้˜ปๅกž๏ผˆ่€—ๆ—ถ๏ผ‰ใ€‚

    go func() {
        time.Sleep(1 * time.Second)
        c1 <- "one"
    }()
    go func() {
        time.Sleep(2 * time.Second)
        c2 <- "two"
    }()

ๆˆ‘ไปฌไฝฟ็”จ select ๅ…ณ้”ฎๅญ—ๆฅๅŒๆ—ถ็ญ‰ๅพ…่ฟ™ไธคไธชๅ€ผ๏ผŒ ๅนถๆ‰“ๅฐๅ„่‡ชๆŽฅๆ”ถๅˆฐ็š„ๅ€ผใ€‚

    for i := 0; i < 2; i++ {
        select {
        case msg1 := <-c1:
            fmt.Println("received", msg1)
        case msg2 := <-c2:
            fmt.Println("received", msg2)
        }
    }
}

่ทŸ้ข„ๆœŸ็š„ไธ€ๆ ท๏ผŒๆˆ‘ไปฌ้ฆ–ๅ…ˆๆŽฅๆ”ถๅˆฐๅ€ผ "one"๏ผŒ็„ถๅŽๆ˜ฏ "two"ใ€‚

$ time go run select.go 
received one
received two

ๆณจๆ„๏ผŒ็จ‹ๅบๆ€ปๅ…ฑไป…่ฟ่กŒไบ†ไธค็ง’ๅทฆๅณใ€‚ๅ› ไธบ 1 ็ง’ ๅ’Œ 2 ็ง’็š„ Sleeps ๆ˜ฏๅนถๅ‘ๆ‰ง่กŒ็š„๏ผŒ

real    0m2.245s

ไธ‹ไธ€ไธชไพ‹ๅญ: ่ถ…ๆ—ถๅค„็†