Golang 从入门到放弃 -0x0D

channel、close、range、select 和超时控制,补齐 Go 并发通信模型。

上一章我们把 goroutine 开起来了,但只会开还不够。多个 goroutine 之间怎么传数据、怎么协调节奏、怎么优雅地超时退出,这一章轮到 channel 和 select 上场。

channel 是什么

可以先把 channel 理解成一根带规矩的管道。一个 goroutine 往里塞数据,另一个 goroutine 从里面拿数据。

ch := make(chan int)

发送数据:

ch <- 10

接收数据:

value := <-ch

箭头方向很形象,数据朝哪边流,你就往哪边看。

无缓冲 channel

默认创建出来的是无缓冲 channel。它的特点是:发送方和接收方要对上节奏,否则谁都别想继续走。

package main

import "fmt"

func main() {
    ch := make(chan string)

    go func() {
        ch <- "hello"
    }()

    msg := <-ch
    fmt.Println(msg)
}

这里如果没有 goroutine,主线程自己给自己发再自己收,就很容易死锁给你看。

有缓冲 channel

有时候你希望这根管道先存几条消息,那就可以加缓冲区。

ch := make(chan int, 2)
ch <- 1
ch <- 2
fmt.Println(<-ch)
fmt.Println(<-ch)

容量是 2,就表示在没人接收的情况下,最多能先塞两个值。再多就堵住。

关闭 channel

当发送方确定后面不会再发数据了,可以关闭 channel。

close(ch)

关闭后不能再往里发送,但接收方还可以把缓冲区里剩下的值拿完。

遍历 channel 时,rangeclose 是绝配。

ch := make(chan int)

go func() {
    for i := 1; i <= 3; i++ {
        ch <- i
    }
    close(ch)
}()

for value := range ch {
    fmt.Println(value)
}

select:多路等待

当你要同时等多个 channel,或者想加一个超时控制,select 就特别好用。

select {
case msg := <-ch1:
    fmt.Println("来自 ch1:", msg)
case msg := <-ch2:
    fmt.Println("来自 ch2:", msg)
default:
    fmt.Println("都没消息")
}

如果没有 defaultselect 会阻塞,直到某个分支能继续执行。加了 default,就会变成“没等到就先走”。

超时控制

配合 time.After,你可以很容易给等待过程加个超时。

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan string)

    go func() {
        time.Sleep(2 * time.Second)
        ch <- "done"
    }()

    select {
    case msg := <-ch:
        fmt.Println(msg)
    case <-time.After(time.Second):
        fmt.Println("超时了")
    }
}

这个模式在调用外部服务、等待异步结果时非常常见。你总不能让一个请求无限等下去,不然等着等着,连用户都忘了自己点过什么了。

小结

channel 和 select 是 Go 并发模型里非常核心的两块:

  • channel 用来在 goroutine 之间传数据。
  • 无缓冲强调同步,有缓冲强调削峰。
  • close + range 是经典组合。
  • select 让你同时等待多个事件,还能顺手做超时控制。

下一章开始做点更像样的东西,我们用 net/http 写一个最简单的 Web 服务。

Read more

Harness Engineering:从驾驭模型到构建 AI 工厂

Harness Engineering:从驾驭模型到构建 AI 工厂

2026 年,AI 编程工具的竞争焦点发生了根本性转变:决定 AI 助手好不好用的,不再是模型本身,而是包裹在模型外面的那层"Harness"。同一个模型,在不同的 Harness 下,性能差距可以达到 78% vs 42%。 这篇文章将带你深入了解 Harness Engineering——这个正在重新定义 AI 工程实践的新兴领域。 一、什么是 Harness Engineering? Harness 的字面意思是"马具/缰绳"——用来驾驭一匹强壮但不受控的马。在 AI 语境下,Harness 就是 LLM 之外的一切:工具定义、记忆系统、权限模型、反馈循环、文档规范、多

By Fuyu Jia

Claude Code CLI + Ralph:让 AI 自动完成大型编程任务的终极方案

TL;DR 当你的编程任务大到一个 AI 对话窗口装不下时,Ralph 会帮你把任务拆成小块,让 Claude Code CLI 一个接一个地自动完成——每轮都用全新的上下文窗口,不会越写越糊涂。 一、什么是 Ralph? Ralph 是一个开源项目(GitHub 16k+ Stars),基于 Geoffrey Huntley 提出的 "Ralph Pattern" 构建。它的核心理念很简单: 不要让 AI 在一个漫长的会话里做完所有事情,而是把大任务拆成小故事,每个故事用一个全新的 AI 实例来完成。 这解决了 AI 编程中最常见的痛点——上下文窗口耗尽。当对话越来越长,AI 的输出质量会明显下降。Ralph 通过「每轮一个新实例」的方式,

By Fuyu Jia