标签 Golang 下的文章

降低 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/28/ai-engineer-gpu-introduction-course

大家好,我是Tony Bai。

就在最近,科技界发生了一件极其戏剧性的事情。本周三美股开盘,全球存储产业巨头——美光、西部数据、希捷的股价遭遇了“黑色时刻”,普遍明显下跌(3%~6%)。

引发这场资本市场大地震的,不是什么贸易战,也不是财报暴雷,而仅仅是谷歌(Google Research)发布的一篇技术论文:《TurboQuant: Redefining AI efficiency with extreme compression

这篇论文宣称,他们发明了一种极端的压缩算法,能在几乎零损耗的情况下,将大模型推理时的 KV 缓存(KV Cache)暴降 6 倍,并让注意力机制的计算速度狂飙 8 倍

很多传统的后端程序员看到这条新闻,可能一头雾水:

  • 什么是 KV Cache?
  • 为什么压缩了一个叫 KV Cache 的东西,就能让卖物理内存芯片的巨头们吓得半死?

在这些雾水和疑惑背后,隐藏着 AI 大模型时代最核心、也最残酷的技术真相:内存墙(Memory Wall)

AI 时代的底色:算力过剩,访存为王

在传统的软件开发中,我们习惯了用 CPU 的思维去思考性能。我们认为程序跑得慢,是因为“计算太复杂”,我们需要更强的算力(更快的 CPU 频率)。

但在大语言模型(LLM)的世界里,逻辑变了。

大模型在生成文本时,是逐字生成(自回归)的。为了不每次都把前面说过的话重新计算一遍,模型会把之前所有上下文的内部特征(Key 和 Value 矩阵)全部保存在显存里。这份庞大的“运行记忆”,就是 KV Cache

随着上下文越来越长(比如从 4K 飙升到 128K 甚至百万级),这份 KV Cache 会像滚雪球一样膨胀。

这就是为什么业界说:KV Cache 是大模型推理名副其实的“吞金兽”。

更要命的是,每次生成一个新的字,GPU 都必须把这份庞大的 KV Cache 从显存(HBM)完整地搬运到计算核心(SRAM)里过一遍。

这就好比你有一个世界上切菜最快的厨师(GPU 算力),但他每次切一片肉,都要跑到 10 公里外的仓库(显存)去取。厨师的手速再快也没有用,整体速度完全被运货卡车的速度(显存带宽)锁死了。

这就是困扰所有 AI 工程师的 “内存墙”。也是为什么各大公司疯狂抢购高显存、高带宽的 H100 显卡的原因。

而谷歌的 TurboQuant 之所以引发地震,正是因为它通过极致的数学算法(极坐标变换 + 1-bit 残差误差校验),直接在软件层面把搬运的数据量压缩了 6 倍!这意味着,同样的硬件,现在能跑更长的上下文、支持更高的并发。存储巨头们能不慌吗?

为什么后端工程师必须懂 GPU?

你可以说:“我只是个调 OpenAI 兼容API 的后端工程师,硬件底层关我什么事?”

在过去的一年里,这是行得通的。但随着开源模型(如 GLM、Qwen、MiniMax、DeepSeek、KIMI等)的全面爆发,以及企业对数据隐私、成本控制的极致追求,“本地化/私有化部署大模型” 也正在成为一些中大型企业的刚需。

当你作为架构师或后端主力,被老板要求把一个 70B 的大模型部署到公司的服务器上时,真正的挑战才刚刚开始:

  • 面对 OOM(显存溢出),你该如何调整参数?
  • 并发量稍微一高,首字延迟(TTFT)就卡到几十秒,你该怎么排查?
  • 采购硬件时,你是买 8 张便宜的 RTX 4090,还是花高价租用带 NVLink 的 A100/H100?
  • 你该如何向团队解释引入 vLLM、FlashAttention 和 INT8/FP8 量化的必要性?

如果你把 GPU 当成一个“跑得更快的 CPU”来用,你将会在上述每一个问题上栽大跟头。

你需要建立一套全新的“硬件心智模型”,这也是我编写这门《AI 工程师的 GPU 入门课:从硬件视角看大模型推理》微专栏的主要目标。

这门微专栏将教你什么?

市面上关于 GPU 和 CUDA 的教程很多,但大多是教你如何写出复杂的 C++ 图形渲染代码,或者如何在学术上推导矩阵乘法。

这门微专栏与众不同。它是专为后端/软件工程师打造的“白盒化” GPU 入门课程。

我们不教图形渲染,不深究复杂的 C++ 语法。我们将直接切入大模型推理的痛点,带你一步步从物理架构走到前沿的 AI 工程技术。

  • 如果你想吃透热门技术: 我们将为你讲透 FlashAttention、PagedAttention (vLLM)、模型量化背后的物理原理。你会发现,这些看似高深的技术,本质上都是在和“内存墙”做斗争。
  • 如果你追求实战落地: 我们不仅教你看懂硬件,还会教你用 Profiling 工具(性能分析器)像侦探一样排查慢查询;作为加餐,我们甚至会教你如何用纯 Go 语言(Zero CGO)直接点火发射 CUDA 内核!

课程目录全景图

为了让你对这趟旅程有一个清晰的预期,以下是本专栏的完整地图:

第一阶段:硬件心智模型
* 第 01 讲 | 硬件解剖:为什么 CPU 是“法拉利”,GPU 是“大巴车”?(含 5090 vs H100 对比)
* 第 02 讲 | 内存金字塔:HBM、SRAM 与不可逾越的“内存墙”

第二阶段:编程模型与工具链
* 第 03 讲 | CUDA 编程模型:指挥“千军万马”的线程艺术
* 第 04 讲 | 性能侦探:性能侦探:拆解 Hello World Kernel 与 Profiling 实战

第三阶段:AI 工程进阶
* 第 05 讲 | 显存管理革命:从 KV Cache 到 PagedAttention (vLLM)
* 第 06 讲 | 算子融合魔法:FlashAttention 的底层原理
* 第 07 讲 | 精度与量化:精度与量化:INT8/FP8 为什么既快又省?
* 第 08 讲 | 分布式推理:Tensor Parallelism (TP) 与通信墙
* 第 09 讲 | 终极指南:如何科学计算 AI 算力需求与硬件选型?

特别加餐:Gopher 的专属浪漫
* 第 10 讲 | 加餐:Go 语言的 GPU 编程——Gopher 的逆袭

小结

在算力的装备竞赛里,最锋利的武器未必是更昂贵的芯片,而是深刻理解软硬件边界的人。

正如谷歌 TurboQuant 证明的那样:懂底层的工程师,只需改写一行底层逻辑,就可能撬动万亿级别的市场价值。

算力时代,不要只做“调包”的局外人。

准备好跨越 CPU 的舒适区,跟我一起深入算力的硅基心脏了吗?

点击这里或扫描下方二维码,开启你的GPU与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