降低 74% 的 P99 尾延迟:揭秘 Go HTTP 客户端的“请求对冲”魔法

本文永久链接 – https://tonybai.com/2026/03/30/reduced-p99-latency-by-request-hedging-in-go

大家好,我是Tony Bai。

在微服务和分布式系统的世界里,我们常常会遇到一个令人头疼的现象:服务在大部分时间(如 P50 或 P90 指标)表现得非常丝滑,但总有那么一小撮请求(P99 甚至 P99.9 指标)慢得令人发指。

近日,在 Reddit 的 r/golang 社区中,一位开发者分享了他将 Go 服务的 P99 延迟降低了 74% 的经验。令人惊讶的是,他所使用的绝招并非升级硬件或重构业务逻辑,而是引入了一个名为 Request Hedging(请求对冲) 的策略。

面对高延迟,我们本能的反应是“重试(Retry)”。但正如这位开发者所发现的:单纯的重试不仅无助于解决长尾延迟,反而可能在系统高负载时雪上加霜。真正有效的方法是处理“落后者”,而不是“失败者”。

本文将带你重温 Google 关于分布式系统的经典论文,深入剖析 Request Hedging 的原理,并手把手教你如何仅使用 Go 标准库,为你的 HTTP 客户端插上“对冲”的翅膀。

尾延迟的诅咒:为什么重试不是万能药?

在深入 Hedging 之前,我们必须先理解什么是尾延迟(Tail Latency)

2013 年,Google 的两位大神 Jeffrey Dean 和 Luiz André Barroso 在《Communications of the ACM》上发表了一篇神级论文:《The Tail at Scale》。在这篇Paper中,他们详细阐述了在大规模分布式系统中,为什么长尾延迟是不可避免的。

哪怕你拥有世界上最优秀的工程师,底层硬件的物理特性(如 CPU 降频、网络拥塞)、操作系统的后台任务(如 IO 调度)、以及语言运行时的特性(如 Go 的 GC 停顿),都会导致某些请求的处理时间远高于平均值。

当你的服务需要并行调用多个下游服务时,这种局部的延迟波动会被急剧放大。 假设一个服务需要调用 100 个叶子节点,如果单个节点响应时间超过 1 秒的概率是 1%,那么整个请求超过 1 秒的概率将飙升至 63%!

注:节点总数 n = 100 ,已知单个节点响应时间超过 1 秒的概率 为1%。单个节点响应时间不超过 1 秒(即正常响应)的概率为1-1% = 99% = 0.99。由于 100 个请求是并行的且相互独立,整个请求“正常”的前提是所有 100 个节点都必须在 1 秒内返回。这种概率为0.99^100=0.366。这样只要这 100 个节点中有任何一个掉链子,整个请求(作为整体)的耗时就会超过 1 秒。其概率为1-0.366≈0.63=63%。


图:来自《The Tail at Scale》

这张图直观地展示了随着服务器数量(Fan-out)增加,哪怕单机变慢的概率极低,整体响应时间变慢的概率也会陡峭上升。

面对超时的请求,传统的做法是实施超时重试(Timeout & Retry)。但重试存在致命缺陷:

  1. 你必须等待超时发生。 如果超时设置为 1 秒,那么重试的请求至少要经历 1 秒的延迟,这根本无法改善 P99 延迟。
  2. 加剧雪崩。 当下游服务因为负载过高而变慢时,大量的重试请求会瞬间淹没下游,导致系统彻底崩溃。

Request Hedging:优雅地跑赢时间

为了解决长尾延迟,Google 论文中提出了一种极具工程智慧的策略:Hedged Requests(请求对冲/对冲请求)

其核心思想非常简单直白:

客户端首先向目标服务器发送一个请求。如果该请求在预期的时间(即“对冲延迟阈值”,Hedging Delay)内没有返回,客户端不会等待其超时或失败,而是立即向另一个副本(或者同一个负载均衡器后的其他实例)发送一模一样的备份请求。客户端将使用最先返回的那个成功响应,并主动取消其余的未决请求。

这种方法之所以有效,是因为导致请求变慢的因素通常是瞬时的且与特定机器相关的(如某台机器刚好在做 GC,或者刚好被一个大查询阻塞了队列)。第二个请求很大概率会被路由到一台健康的、空闲的机器上,从而快速返回。

Hedging 与 Retry 的本质区别:

  • Retry:针对的是失败(Failure)。必须等第一个请求彻底失败或超时,才发起第二个。
  • Hedging:针对的是慢(Slowness)。第一个请求还在运行(没报错),第二个请求就已经出发了。它们是并行竞争的关系。

虽然这听起来像是在浪费服务器资源,但 Google 的实践证明,如果将 Hedging Delay 设置为 P95 延迟(即 95% 的请求都能在这个时间内完成),那么只有 5% 的请求会触发对冲。这仅仅增加了 5% 的系统负载,却能将 P99 或 P99.9 的长尾延迟削减大半!

在现代微服务生态中,gRPC 已经在 Service Config 中原生支持了 Hedging 策略,但对于广泛使用的 HTTP/REST 接口,我们通常需要自己实现。

实战:构建可压测的 Hedging HTTP Client

为了验证 Hedging 的威力,我们将使用 Go 原生标准库,从零实现一个带有对冲机制的 http.RoundTripper,并构建一个完整的压测实验环境。

项目布局

首先,创建一个新的 Go 项目:

mkdir go-hedging-demo
cd go-hedging-demo
go mod init hedging-demo

我们将创建三个文件:

  • hedge.go:包含核心的 Hedging 逻辑实现。
  • server.go:一个模拟真实分布式环境、带有随机高延迟的测试服务器。
  • main.go:客户端压测入口,用于对比普通请求和 Hedging 请求的性能差异。
go-hedging-demo/
├── go.mod
├── hedge.go
├── server.go
└── main.go

核心实现:hedge.go

我们将通过实现 http.RoundTripper 接口,优雅地将对冲逻辑无缝注入到 Go 标准库的 http.Client 中。

// hedge.go
package main

import (
    "context"
    "errors"
    "net/http"
    "sync"
    "time"
)

// HedgedTransport 实现了 http.RoundTripper 接口
type HedgedTransport struct {
    Transport   http.RoundTripper // 底层真正的 Transport
    MaxAttempts int               // 最大并发请求数(包括最初的1次)
    HedgeDelay  time.Duration     // 触发对冲的延迟时间
}

func (ht *HedgedTransport) RoundTrip(req *http.Request) (*http.Response, error) {
    // 如果没有设置,使用默认行为
    transport := ht.Transport
    if transport == nil {
        transport = http.DefaultTransport
    }
    attempts := ht.MaxAttempts
    if attempts <= 0 {
        attempts = 1
    }

    // 使用带有取消功能的 context 控制整个对冲生命周期
    ctx, cancel := context.WithCancel(req.Context())
    defer cancel()

    // 结果通道,用于接收第一个成功的响应或错误
    type result struct {
        resp *http.Response
        err  error
    }
    resCh := make(chan result, attempts)
    var wg sync.WaitGroup

    // 启动一个请求的闭包函数
    doRequest := func() {
        wg.Add(1)
        go func() {
            defer wg.Done()
            // 克隆请求,防止并发修改
            cloneReq := req.Clone(ctx)
            resp, err := transport.RoundTrip(cloneReq)

            // 只有当请求不是因为 context 取消而失败时,才尝试写入结果
            if !errors.Is(err, context.Canceled) {
                select {
                case resCh <- result{resp: resp, err: err}:
                default:
                    // 通道已满或已不再需要,直接丢弃(如果 resp 不为空,需要关闭 Body 以防泄露)
                    if resp != nil && resp.Body != nil {
                        resp.Body.Close()
                    }
                }
            }
        }()
    }

    // 1. 发起第一个请求
    doRequest()

    // 2. 控制对冲的定时器和尝试次数
    timer := time.NewTimer(ht.HedgeDelay)
    defer timer.Stop()

    errs := make([]error, 0, attempts)
    requestsSent := 1

    for {
        select {
        case res := <-resCh:
            // 收到结果
            if res.err == nil {
                // 成功!立即取消其他还在飞行的请求
                cancel()
                // 等待后台 goroutine 清理完成 (可选,这里为了简单不阻塞)
                return res.resp, nil
            }
            // 如果这个请求失败了,记录错误
            errs = append(errs, res.err)
            // 如果所有发出的请求都失败了,且已经达到最大尝试次数,返回错误
            if len(errs) == attempts {
                return nil, errors.Join(errs...)
            }

            // 如果一个请求失败了,且还没达到最大尝试次数,我们不应该死等 Timer,
            // 而应该立刻触发下一个对冲请求(这里为了简化逻辑,依然依赖下一次 Timer 或失败循环)
            // 实际生产级实现可以在这里直接触发 doRequest()

        case <-timer.C:
            // 对冲延迟到达
            if requestsSent < attempts {
                // 触发对冲请求
                doRequest()
                requestsSent++
                // 重置定时器,准备下一次可能的对冲
                timer.Reset(ht.HedgeDelay)
            }

        case <-ctx.Done():
            // 整个请求超时或被调用方取消
            return nil, ctx.Err()
        }
    }
}

这里,我们使用了 req.Clone(ctx) 来复制请求,确保并发安全。通过 context.WithCancel 控制所有的下游请求,一旦有一个请求成功返回(res.err == nil),立即调用 cancel() 取消其余正在运行(in-flight)的请求。

测试服务器:模拟“长尾效应” server.go

为了看到效果,我们编写一个简单的 HTTP 服务。它在 90% 的情况下在 50ms 内快速响应,但在 10% 的情况下会遇到长达 500ms 到 1s 的长尾延迟。

// server.go
package main

import (
    "fmt"
    "math/rand"
    "net/http"
    "time"
)

func startServer() {
    http.HandleFunc("/data", func(w http.ResponseWriter, r *http.Request) {
        // 模拟 10% 的长尾延迟
        if rand.Float32() < 0.1 {
            // 长尾延迟:500ms - 1000ms
            delay := 500 + rand.Intn(500)
            time.Sleep(time.Duration(delay) * time.Millisecond)
        } else {
            // 正常响应:10ms - 50ms
            delay := 10 + rand.Intn(40)
            time.Sleep(time.Duration(delay) * time.Millisecond)
        }

        fmt.Fprintln(w, "OK")
    })

    go func() {
        err := http.ListenAndServe(":8080", nil)
        if err != nil {
            panic(err)
        }
    }()
    time.Sleep(100 * time.Millisecond) // 等待服务器启动
}

压测入口:对比见真章 main.go

最后,我们编写压测代码,分别使用普通 Client 和 Hedged Client 发送 1000 个并发请求,并统计 P99 延迟。

// main.go
package main

import (
    "fmt"
    "io"
    "net/http"
    "sort"
    "sync"
    "time"
)

const RequestCount = 1000

func main() {
    startServer()

    fmt.Println("开始压测普通 HTTP Client...")
    normalClient := &http.Client{
        Timeout: 2 * time.Second,
    }
    normalLatencies := runBenchmark(normalClient)

    fmt.Println("\n开始压测 Hedged HTTP Client...")
    hedgedClient := &http.Client{
        Timeout: 2 * time.Second,
        Transport: &HedgedTransport{
            Transport:   http.DefaultTransport,
            MaxAttempts: 3,                 // 最多发送3个请求
            HedgeDelay:  80 * time.Millisecond, // P95 延迟设为触发点(我们服务器正常响应 < 50ms)
        },
    }
    hedgedLatencies := runBenchmark(hedgedClient)

    // 打印统计结果
    printStats("Normal Client", normalLatencies)
    printStats("Hedged Client", hedgedLatencies)
}

func runBenchmark(client *http.Client) []time.Duration {
    var wg sync.WaitGroup
    latencies := make([]time.Duration, RequestCount)

    for i := 0; i < RequestCount; i++ {
        wg.Add(1)
        go func(index int) {
            defer wg.Done()

            start := time.Now()
            resp, err := client.Get("http://localhost:8080/data")
            if err != nil {
                fmt.Printf("Request failed: %v\n", err)
                return
            }
            io.Copy(io.Discard, resp.Body)
            resp.Body.Close()

            latencies[index] = time.Since(start)
        }(i)
    }

    wg.Wait()
    return latencies
}

func printStats(name string, latencies []time.Duration) {
    // 去除可能的失败请求(0值)
    valid := make([]time.Duration, 0, len(latencies))
    for _, l := range latencies {
        if l > 0 {
            valid = append(valid, l)
        }
    }

    sort.Slice(valid, func(i, j int) bool {
        return valid[i] < valid[j]
    })

    if len(valid) == 0 {
        fmt.Printf("No valid responses for %s\n", name)
        return
    }

    p50 := valid[len(valid)/2]
    p95 := valid[int(float64(len(valid))*0.95)]
    p99 := valid[int(float64(len(valid))*0.99)]

    fmt.Printf("\n=== %s 统计 ===\n", name)
    fmt.Printf("请求总数: %d\n", len(valid))
    fmt.Printf("P50 延迟: %v\n", p50)
    fmt.Printf("P95 延迟: %v\n", p95)
    fmt.Printf("P99 延迟: %v\n", p99)
}

运行与验证

在本地 MacBook Pro 的终端上执行 go run .,我得到了以下真实的性能对决:

$go run .
开始压测普通 HTTP Client...

开始压测 Hedged HTTP Client...

=== Normal Client 统计 ===
请求总数: 1000
P50 延迟: 115.226929ms
P95 延迟: 850.768537ms <-- 注意看这里
P99 延迟: 1.045720114s <-- 长尾效应严重

=== Hedged Client 统计 ===
请求总数: 1000
P50 延迟: 138.930108ms <-- P50 轻微损耗
P95 延迟: 360.607686ms <-- 巨大的改善!
P99 延迟: 376.98949ms  <-- P99 降低了将近 70%!

正如你所见:

  • P99 巨幅改善:对冲机制成功将 P99 延迟降低了 64%。原本需要 1 秒以上的极端慢请求,现在被控制在了 400ms 以内。
  • P50 轻微损耗:由于请求克隆、Context 管理以及本地 CPU 调度多出一倍请求的竞争,P50 上升了约 23ms。

结论:在典型的分布式系统中,这种权衡是极度划算的。我们用极小的平均延迟上升,换取了尾部延迟的高稳定性。

生产环境的避坑指南

Request Hedging 虽好,但绝非能随意滥用的“银弹”。在将其部署到生产环境之前,你必须考虑以下几个核心约束:

  1. 绝对的幂等性(Idempotency):对冲意味着同一笔请求可能同时发送给后端的两个节点。如果这是个 POST 扣款请求,而你的后端没有做好幂等性控制,这将会是一场灾难。Hedging 最好只用于幂等的只读请求(如 GET),或者有严格全局事务 ID 兜底的写入操作。
  2. Hedge Delay 的设定:这是最考验架构师的参数。设得太短,所有的请求都会变成双倍发送,瞬间打挂后端(这叫放大攻击);设得太长,起不到降低长尾的作用。最佳实践是通过 Prometheus 等监控工具,计算出该接口过去的 P95 响应时间,将其作为 Hedging Delay 的基准值。
  3. 熔断与限流(Throttling):如果下游服务整体宕机,所有的请求都会变慢,此时触发所有的对冲请求只会加速死亡。因此,正如 gRPC 规范中要求的,Hedging 必须与限流(Throttling)结合。例如,计算一个“对冲令牌池”,只有当成功请求大于失败请求达到一定比例时,才允许发送对冲请求。

小结

软件工程是一门关于权衡的艺术。在追求极致性能的道路上,我们往往将目光局限于优化数据库索引、压缩 JSON 序列化,却忽视了分布式系统固有的宏观不确定性。

Request Hedging 是从宏观架构层面给出的一记漂亮的防守反击。通过上面几百行的 Go 代码,我们成功复现了 Google 级别的架构优化。下一次,当你的监控大盘上 P99 曲线再次异常抖动时,不妨收起单纯的“超时重试”,尝试给你的 Go 客户端加一点“对冲”的魔法吧。

本文中涉及的代码可以在这里下载。https://github.com/bigwhite/experiments/tree/master/go-hedging-demo

资料链接:

  • https://www.reddit.com/r/golang/comments/1s4mb10/reduced_p99_latency_by_74_in_go_learned_something/
  • https://grpc.io/docs/guides/request-hedging/
  • https://research.google/pubs/the-tail-at-scale/

你的 P99 达标了吗?

尾延迟是分布式系统中最难缠的对手。在你的项目中,主要的长尾延迟来源是什么?你会为了降低那 1% 的极端慢请求,而接受 5% 的额外系统负载吗?

欢迎在评论区分享你的性能调优“必杀技”!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


你的Go技能,是否也卡在了“熟练”到“精通”的瓶颈期?

  • 想写出更地道、更健壮的Go代码,却总在细节上踩坑?
  • 渴望提升软件设计能力,驾驭复杂Go项目却缺乏章法?
  • 想打造生产级的Go服务,却在工程化实践中屡屡受挫?

继《Go语言第一课》后,我的《Go语言进阶课》终于在极客时间与大家见面了!

我的全新极客时间专栏 《Tony Bai·Go语言进阶课》就是为这样的你量身打造!30+讲硬核内容,带你夯实语法认知,提升设计思维,锻造工程实践能力,更有实战项目串讲。

目标只有一个:助你完成从“Go熟练工”到“Go专家”的蜕变! 现在就加入,让你的Go技能再上一个新台阶!


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

别再用 AI 疯狂撸代码了!我们正在把自己逼入“死胡同”

本文永久链接 – https://tonybai.com/2026/03/29/stop-mindless-ai-coding-we-are-heading-to-a-dead-end

大家好,我是Tony Bai。

过去的一年,大概是所有程序员肾上腺素飙升最快的一年。

从早期的 Copilot、Cursor到如今的Claude Code、Codex,再到各种号称能“全自动开发”的 Agent Swarm(智能体集群)。只要在周末花上几个小时,敲几句 Prompt,你就能把以前想做却没时间做的 Side Project 全部干出来。

甚至,连微软 CEO Satya Nadella 都在四处宣扬“微软现在有多少代码是 AI 写的”。仿佛在一夜之间,“一个人就是一家公司”、“一天撸完一个 SaaS 平台”成了技术圈的标配。

但在这场速度的狂欢中,你有没有感觉到一丝不对劲?

最近,国外资深开发者 Mario Zechner 写了一篇极其辛辣的文章《Thoughts on slowing the f**k down》。他毫不客气地戳破了这层“繁荣”的窗户纸:

当我们把 AI 智能体(Agent)全面引入生产代码库后,我们并没有迎来软件工程的乌托邦,反而正在以惊人的速度,制造着前所未有的“屎山”和灾难。

今天,我想结合他的反思,以及我最近在使用 AI 原生开发时的一些切身痛点,给大家浇一盆冷水。在被大模型彻底“惯坏”之前,我们必须看清,过度依赖 Agent 正在如何毁掉我们的系统,甚至我们的职业生涯。

100% AI 生成,等于 100% 的不可控

很多公司和独立开发者喜欢标榜:“我的产品 100% 是由 AI 写的。”

他们以为这是高科技的证明,但在行家眼里,这简直是灾难的代名词。

那些号称“完全脱手、让 Agent 自己去写”的代码库,往往充斥着你能想象到的最糟糕的垃圾:

高达几个 G 的内存泄漏、莫名其妙的 UI 闪烁、完全没有一致性的设计模式,以及一碰就碎的核心逻辑。

为什么会这样?难道现在的 AI 不够聪明吗?

原因在于:Agent 是“没有痛感”的,而人类有。

在传统的手工编码时代,人类程序员是一个天然的“物理瓶颈”。你一天最多只能写 500 行高质量代码。如果你在这个过程中犯了错(比如引入了某个不良的抽象,或者写了一个极其恶心的嵌套),你会立刻感到“痛苦”

为了避免这种痛苦,你会花时间去重构,去梳理架构,或者因为被 Reviewer 骂了一顿而痛改前非。

痛苦,逼着人类去学习和进化,逼着系统保持在一个“可维护”的边界内。

但 Agent 呢?它是一台没有感情的打字机。

它可以在几分钟内拉出两万行代码。如果其中包含了一个微小的设计缺陷,它不会感到痛苦。相反,它会在你看不见的地方,将这个缺陷以成百上千倍的速度“复利式地放大(Compound)”

等你回过神来,想要在这个 100% 由 AI 生成的系统上加一个新功能时,你会绝望地发现:你连它长什么样都不知道,而且它已经烂到连 AI 自己都改不动了。

为什么 AI 连自己写的屎山都修不好?

有人可能会说:“既然 AI 能写屎山,那我再派一个高级 Agent 去重构这堆屎山不就行了?”

这就是当下最可怕的“平替思维”陷阱。

现实是:当代码的复杂度和体积膨胀到一定程度后,AI 的“召回率(Recall)”会呈现断崖式下跌。

这不仅仅是上下文窗口大小(Context Window)的问题。在拥有百万行代码的迷宫中,Agent 根本不知道该去哪里找相关的依赖,不知道哪些旧代码可以复用。它只能基于极其局部的视野(Local View)去做决策。

这就导致了极度荒谬的现象:Agent 在重构时,不仅找不到病根,反而会发明出更多为了抽象而抽象的垃圾代码,让屎山开出更加绚丽的“奇葩”。

人类制造企业级的屎山,需要几十个程序员耗费好几年的时间来堆砌;

而你,只需要带上 2 个 AI Agent,几个星期就能搞出一个连上帝都看不懂的废墟。

当你发现连号称 100% 覆盖率的 AI 测试用例都在撒谎时,除了手动去点产品、祈祷它别崩溃,你已经失去了对系统的任何掌控力。

我们该如何与 Agent 共生?

难道我们要砸烂电脑,退回到手敲汇编的时代吗?当然不是。

Agent 就像古希腊神话中的海妖塞壬(Sirens),用极速的快感诱惑着你。我们必须在它摧毁我们的工程纪律之前,重新夺回主动权。

真正的顶级开发者,绝不会对 AI 说:“嘿,帮我把这个系统全干了。”

他们与 Agent 的协作,遵循着极其严苛的边界:

1. 坚决把控“系统的整体结构”

什么是系统的整体结构?那是你的核心架构设计、API 的边界、数据库的实体关系,以及整个系统跑起来时的“手感”。

这些东西,必须由你亲手来写,或者通过 Pair Programming(结对编程)一行一行地推敲。

只有亲手写过,感受到那份“摩擦力”,你才能在脑海中建立起对系统的上帝视角。这是目前任何 SOTA(最先进)大模型都无法替代的品味与经验。

2. 让 AI 去干“不用动脑子”的脏活

Agent 最适合的场景,是那些不需要全局视野的局部任务:写一段正则、爬个数据、写几条枯燥的单元测试,或者是写一个就算坏了也不影响公司赚钱的内部临时脚本。

把时间花在“决定做什么”和“决定不做什么”上。学会对需求说“不”,本身就是最高级的特性。

3. 强制减速

这是最反直觉,也是最重要的一条建议。

不要为了追求那虚荣的“代码生成量”而沾沾自喜。给自己设定一个限制:每天 AI 生成的代码量,绝对不能超过你“能够深入 Review 和理解”的极限。

你必须确保,如果明天所有的 AI 公司突然破产,你依然能从容地接管这个系统,因为它的每一根骨架,都在你的掌控之中。

小结:只有人类,才能兜住底线

在过去的一年里,我们把太多的权力让渡给了机器,以至于我们忘记了软件工程的本质。

在这个鼓吹“快、更快、再快一点”的癫狂时代,慢下来,反而成了最稀缺的竞争力。

你的代码可能不再是纯手工敲出来的了,但你的架构品味、你的工程纪律、你在出 Bug 时能一针见血找到根源的敏锐直觉,才是你在这个时代安身立命的根本。

一切自动化,最终都需要人类的纪律(Discipline)与主体性(Agency)来兜底。

机器可以写代码,但只有人类,才能为系统注入灵魂。

资料链接:https://mariozechner.at/posts/2026-03-25-thoughts-on-slowing-the-fuck-down


今日互动探讨:

在日常开发中,你有没有遇到过被 AI 生成的“看似完美、实则藏雷”的代码坑得很惨的经历?你是怎么发现并解决的?

在 AI 编程的浪潮中,你觉得人类程序员最不可被替代的核心能力是什么?

欢迎在评论区分享你的血泪史与思考!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 AI原生开发工作流实战 Go语言精进之路1 Go语言精进之路2 Go语言第一课 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com
这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats