Go by Example ไธญๆ–‡็‰ˆ: ่ถ…ๆ—ถๅค„็†

่ถ…ๆ—ถ ๅฏนไบŽไธ€ไธช้œ€่ฆ่ฟžๆŽฅๅค–้ƒจ่ต„ๆบ๏ผŒ ๆˆ–่€…ๆœ‰่€—ๆ—ถ่พƒ้•ฟ็š„ๆ“ไฝœ็š„็จ‹ๅบ่€Œ่จ€ๆ˜ฏๅพˆ้‡่ฆ็š„ใ€‚ ๅพ—็›ŠไบŽ้€š้“ๅ’Œ select๏ผŒๅœจ Go ไธญๅฎž็Žฐ่ถ…ๆ—ถๆ“ไฝœๆ˜ฏ็ฎ€ๆด่€Œไผ˜้›…็š„ใ€‚

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

ๅœจ่ฟ™ไธชไพ‹ๅญไธญ๏ผŒๅ‡ๅฆ‚ๆˆ‘ไปฌๆ‰ง่กŒไธ€ไธชๅค–้ƒจ่ฐƒ็”จ๏ผŒ ๅนถๅœจ 2 ็ง’ๅŽไฝฟ็”จ้€š้“ c1 ่ฟ”ๅ›žๅฎƒ็š„ๆ‰ง่กŒ็ป“ๆžœใ€‚

    c1 := make(chan string, 1)
    go func() {
        time.Sleep(2 * time.Second)
        c1 <- "result 1"
    }()

่ฟ™้‡Œๆ˜ฏไฝฟ็”จ select ๅฎž็Žฐไธ€ไธช่ถ…ๆ—ถๆ“ไฝœใ€‚ res := <- c1 ็ญ‰ๅพ…็ป“ๆžœ๏ผŒ<-time.After ็ญ‰ๅพ…่ถ…ๆ—ถ๏ผˆ1็ง’้’Ÿ๏ผ‰ไปฅๅŽๅ‘้€็š„ๅ€ผใ€‚ ็”ฑไบŽ select ้ป˜่ฎคๅค„็†็ฌฌไธ€ไธชๅทฒๅ‡†ๅค‡ๅฅฝ็š„ๆŽฅๆ”ถๆ“ไฝœ๏ผŒ ๅ› ๆญคๅฆ‚ๆžœๆ“ไฝœ่€—ๆ—ถ่ถ…่ฟ‡ไบ†ๅ…่ฎธ็š„ 1 ็ง’็š„่ฏ๏ผŒๅฐ†ไผšๆ‰ง่กŒ่ถ…ๆ—ถ caseใ€‚

    select {
    case res := <-c1:
        fmt.Println(res)
    case <-time.After(1 * time.Second):
        fmt.Println("timeout 1")
    }

ๅฆ‚ๆžœๆˆ‘ไปฌๅ…่ฎธไธ€ไธช้•ฟไธ€็‚น็š„่ถ…ๆ—ถๆ—ถ้—ด๏ผš3 ็ง’๏ผŒ ๅฐฑๅฏไปฅๆˆๅŠŸ็š„ไปŽ c2 ๆŽฅๆ”ถๅˆฐๅ€ผ๏ผŒๅนถไธ”ๆ‰“ๅฐๅ‡บ็ป“ๆžœใ€‚

    c2 := make(chan string, 1)
    go func() {
        time.Sleep(2 * time.Second)
        c2 <- "result 2"
    }()
    select {
    case res := <-c2:
        fmt.Println(res)
    case <-time.After(3 * time.Second):
        fmt.Println("timeout 2")
    }
}

่ฟ่กŒ่ฟ™ไธช็จ‹ๅบ๏ผŒ้ฆ–ๅ…ˆๆ˜พ็คบ่ฟ่กŒ่ถ…ๆ—ถ็š„ๆ“ไฝœ๏ผŒ็„ถๅŽๆ˜ฏๆˆๅŠŸๆŽฅๆ”ถ็š„ใ€‚

$ go run timeouts.go 
timeout 1
result 2

ไธ‹ไธ€ไธชไพ‹ๅญ: ้ž้˜ปๅกž้€š้“ๆ“ไฝœ