# 选

**等多个通道里第一个就绪的,返回其下标。**

```xuantie
设 fast = 道(1)
设 slow = 道(1)
设 idx = 选([fast, slow], 5000)
```

## 你可以……

- **按下标分派**——配 `匹配` 判断是哪个通道就绪,超时走 `_`:

```xuantie
设 idx = 选([data, ctrl], 1000)
匹配 idx {
    0 -> { 示("数据通道就绪") }
    1 -> { 示("控制通道就绪") }
    _ -> { 示("超时") }
}
```

- **给单通道等待加超时**——超时返回 `-1`:

```xuantie
设 idx = 选([ch], 1000)
若 idx >= 0 {
    示("收到: " & ch.收())
} 否 {
    示("超时,重试...")
}
```

- **非阻塞试探**——超时给 `0`,立即返回:有货返下标,没货返 `-1`:

```xuantie
设 idx = 选([通道], 0)
```

## 注意

- `选` 只告诉你「哪个通道就绪」,不替你取数据——拿到下标后自己 `收`。
- 返回可能晚于你给的超时毫秒:主线程等待期间会顺带驱动 fiber 调度器,若 fiber 里有长睡眠,等待会持续到它跑完一轮;超时到期仍未就绪才返回 `-1`。
- `选` 是挂起点:出现在循环体内会让整个 `异步` 块走线程池(路由规则同 `等待`)。

## 相关

[道](道.md) · [异步](异步.md) · [等待](等待.md)