Go by Example: Select

Go select cho phép bạn đợi nhiều channel hoạt động. Kết hợp giữa goroutine và channel với select là một tính năng mạnh mẽ của Go.

package main
import (
    "fmt"
    "time"
)

Cho ví dụ chúng ta, chúng ta sẽ select 2 channel.

func main() {
    c1 := make(chan string)
    c2 := make(chan string)

Mỗi channel sẽ nhận một giá trị sau một khoảng thời gian, để giả lập, ví dụ chặn RPC hoạt động thực thi trong những goroutine chạy đồng thời.

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

Chúng ta sẽ sử dụng select để đợi cả 2 giá trị này một cách đồng thời, in chúng ra khi chúng nhận được.

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

Chúng ta nhận giá trị "one" và sau đó "two" như mong đợi.

$ time go run select.go 
received one
received two

Luư ý rằng tổng thời gian thực thi chỉ xấp xỉ 2 giây kể từ khi cả giây 1 và giây 2 Sleeps thực thi đồng thời.

real    0m2.245s

Ví dụ tiếp theo: Timeouts.