---
title: 取消與收尾
aliases: [context cancellation]
type: concept
status: ready
domain: go
topics: [context, 取消, goroutine]
based_on: ["G04 取消不再需要的工作", "可以取消的管線"]
created: 2026-09-22
lang: zh-Hant
---

取消是通知，收尾是確認工作已結束。`cancel()` 不會強制終止 goroutine，也不等待它返回。

可能阻塞的 send 要有另一條出口：

```go
select {
case out <- value:
case <-ctx.Done():
    return
}
```

`select` 同時有多個可執行分支時，不保證取消優先。無緩衝的 channel 沒有接收方時，send 不能繼續；取消生效後，便可走取消分支。

需要確認收尾時，另用 `WaitGroup` 或完成通知。不要把「已呼叫 cancel」當成「工作已結束」。

[context.CancelFunc](https://pkg.go.dev/context#CancelFunc)、[Select statements](https://go.dev/ref/spec#Select_statements)
