分类 技术志 下的文章

别再像 2015 年那样写 Go 了:Modern Go 终极进化指南

本文永久链接 – https://tonybai.com/2026/03/02/modern-go-evolution-guide-1-0-to-1-26

大家好,我是Tony Bai。

Go 语言在业界最著名的标签之一就是“向后兼容承诺(Go 1 Compatibility Promise)”。一份 10 年前写下的 Go 1.4 代码,在今天的 Go 1.26 编译器下依然能完美编译并运行。

但这带来了一个副作用:许多 Go 开发者的思维和编码习惯,也停留在过去的时代。

我们依然能看到满天飞的 interface{}、冗长易错的 for 循环切片查找、为了获取指针而被迫抽离的辅助函数,以及在并发测试中繁琐的 Context 初始化。

近日,JetBrains 开源了一个名为 use-modern-go 的 AI Coding Agent Skill。这份Skill文件通过精准的 Prompt,强迫 AI 智能体在生成 Go 代码时,必须根据项目 go.mod 的版本,使用该版本支持的最现代化、最优雅的语法和标准库

这份文件简直是一座宝库!它不仅是给 AI 看的指令,更是给每一位 Gopher 的“代码现代化”体检表。

本文将以这份资料为基础,全面盘点从 Go 1.0 一路演进到 Go 1.26 的 Modern Go 特性。我们将通过清晰的 Before / After 对比示例,带你洗礼一遍 Go 语言的现代化之美。

第一阶段:早期的代码净化(Go 1.0 – Go 1.19)

虽然是早期版本,但这些 API 的引入确立了 Go 代码“少即是多”的审美基调。

时间的优雅流逝 (time.Since / time.Until)

在计算耗时或剩余时间时,不要再手动做减法了。

❌ Before (Legacy):

start := time.Now()
// do work
elapsed := time.Now().Sub(start)

deadline := time.Now().Add(5 * time.Second)
remaining := deadline.Sub(time.Now())

✅ After (Modern – Go 1.0/1.8):

start := time.Now()
// do work
elapsed := time.Since(start)

deadline := time.Now().Add(5 * time.Second)
remaining := time.Until(deadline)

错误处理的革命 (errors.Is)

Go 1.13 引入了错误包装(Error Wrapping)。使用 == 判断错误已经不再安全。

❌ Before (Legacy):

if err == sql.ErrNoRows {
    // 无法捕获 fmt.Errorf("query failed: %w", sql.ErrNoRows) 包装后的错误
}

✅ After (Modern – Go 1.13):

if errors.Is(err, sql.ErrNoRows) {
    // 即使被多层 %w 包装,依然能准确识别
}

告别 interface{} (any)

Go 1.18 引入了泛型,同时带来了一个赏心悦目的类型别名 any。

❌ Before (Legacy):

func PrintAll(vals[]interface{}) { ... }

✅ After (Modern – Go 1.18):

func PrintAll(vals[]any) { ... }

字符串无损切割 (strings.Cut / bytes.Cut)

解析键值对是最常见的操作。过去我们需要 strings.Index 配合切片操作,极易引发 panic: slice bounds out of range。

❌ Before (Legacy):

idx := strings.Index(header, ":")
if idx != -1 {
    key := header[:idx]
    value := header[idx+1:]
}

✅ After (Modern – Go 1.18):

if key, value, found := strings.Cut(header, ":"); found {
    // 安全、直观、一次调用
}

高性能字符串追加 (fmt.Appendf)

Go 1.19 引入了直接向字节切片追加格式化字符串的能力,避免了 fmt.Sprintf 带来的隐式内存分配。

❌ Before (Legacy):

buf := []byte("Prefix: ")
buf = append(buf,[]byte(fmt.Sprintf("user_id=%d", id))...) // 发生堆分配

✅ After (Modern – Go 1.19):

buf :=[]byte("Prefix: ")
buf = fmt.Appendf(buf, "user_id=%d", id) // 零分配(如果 buf 容量充足)

类型安全的原子操作 (atomic.Bool/Int64/Pointer)

放弃 atomic.Value 和难记的 atomic.StoreInt32 吧,Go 1.19 的泛型原子类型既安全又易读。

❌ Before (Legacy):

var flag int32 // 0: false, 1: true
atomic.StoreInt32(&flag, 1)
if atomic.LoadInt32(&flag) == 1 { ... }

✅ After (Modern – Go 1.19):

var flag atomic.Bool
flag.Store(true)
if flag.Load() { ... }

var cfg atomic.Pointer[Config]
cfg.Store(&Config{})

第二阶段:标准库的泛型文艺复兴(Go 1.20 – Go 1.21)

在这个阶段,经过两个大版本打磨的 Go 泛型,彻底释放了泛型的潜力,引入了大量期待已久的内置函数和集合操作库。

明确的克隆 (strings.Clone / bytes.Clone)

当你想持有一个大字符串/字节切片的极小一部分,又不想让垃圾回收器保留整个底层大数组时,你需要 Clone。

❌ Before (Legacy):

// 丑陋的黑魔法来强制复制字符串
copiedStr := string([]byte(hugeString[:10]))

✅ After (Modern – Go 1.20):

copiedStr := strings.Clone(hugeString[:10])

溯源 Context 取消原因 (context.WithCancelCause)

Context 被取消了,但究竟是因为超时、主动取消,还是底层的网络错误?Go 1.20 让你能够携带取消原因。

❌ Before (Legacy):

ctx, cancel := context.WithCancel(parent)
// 发生错误时
cancel()
// 其他协程只知道 ctx.Err() == context.Canceled

✅ After (Modern – Go 1.20):

ctx, cancel := context.WithCancelCause(parent)
// 发生错误时
cancel(fmt.Errorf("db connection lost"))

// 消费端可以查明真凶
err := context.Cause(ctx) // 返回 "db connection lost"

(注:Go 1.21 还补充了 context.WithTimeoutCause)

内置的魔法:min, max, clear

这是 Go 1.21 最受欢迎的内置函数。

❌ Before (Legacy):

// 求最大值(非浮点数只能自己写 if/else)
m := a
if b > m { m = b }

// 清空 Map
for k := range myMap { delete(myMap, k) }

✅ After (Modern – Go 1.21):

m := max(a, b) // 支持所有可比较类型
clear(myMap)   // 高效清空 map,保留底层容量

强大的 slices 和 maps 库

告别手动写 for 循环查找元素的日子。

❌ Before (Legacy):

func contains(list[]string, target string) bool {
    for _, v := range list {
        if v == target { return true }
    }
    return false
}

✅ After (Modern – Go 1.21):

import "slices"
import "maps"

// 查找
found := slices.Contains(items, target)
idx := slices.IndexFunc(users, func(u User) bool { return u.ID == 42 })

// 排序 (原 sort.Slice 需要写繁琐的 Less 函数)
slices.Sort(ints)
slices.SortFunc(users, func(a, b User) int { return cmp.Compare(a.Age, b.Age) })

// 紧凑与裁剪
items = slices.Compact(items) // 移除连续重复元素
items = slices.Clip(items)    // 移除切片多余的 capacity

// 字典操作
clonedMap := maps.Clone(originalMap)
maps.DeleteFunc(m, func(k string, v int) bool { return v < 0 })

更聪明的单次执行 (sync.OnceFunc / OnceValue)

sync.Once 很好用,但如果我们想只初始化一次并返回一个值,过去需要闭包外变量和额外的锁。

❌ Before (Legacy):

var once sync.Once
var config *Config
func GetConfig() *Config {
    once.Do(func() { config = loadConfig() })
    return config
}

✅ After (Modern – Go 1.21):

// 声明即完成包装,线程安全且优雅
var GetConfig = sync.OnceValue(func() *Config {
    return loadConfig()
})

// 使用
cfg := GetConfig()

第三阶段:语法细节与 Web 路由的飞跃(Go 1.22)

整数范围循环 (for i := range n)

❌ Before: for i := 0; i < 10; i++ { … }
✅ After: for i := range 10 { … }

默认值救星 (cmp.Or)

返回第一个非零值,简直是读取环境变量的神器。

❌ Before (Legacy):

port := os.Getenv("PORT")
if port == "" {
    port = "8080"
}

✅ After (Modern – Go 1.22):

port := cmp.Or(os.Getenv("PORT"), "8080")

史诗级加强的 http.ServeMux

标准库路由器终于支持 HTTP 方法和路径参数了,很多小项目再也不需要引入 gin 或 chi。

✅ Modern Go 1.22:

mux := http.NewServeMux()
mux.HandleFunc("POST /api/users/{id}", func(w http.ResponseWriter, r *http.Request) {
    userID := r.PathValue("id")
    // ...
})

第四阶段:迭代器时代的黎明(Go 1.23 – Go 1.24)

Go 1.23 引入了 iter.Seq(迭代器),这是自泛型以来最大的范式转变。它统一了所有“序列”的遍历方式。

迭代器与切片/字典的梦幻联动

提取 map 的所有 key 并排序,过去需要手动 append 加 sort。

✅ Modern Go 1.23:

// 获取字典的 keys 迭代器 -> 收集为切片 -> 返回新切片
keys := slices.Collect(maps.Keys(m))

// 收集并一步排序
sortedKeys := slices.Sorted(maps.Keys(m))

测试和基准测试的现代化 (t.Context(), b.Loop())

Go 1.24 对 testing 库进行了大规模重构,代码更加精简防错。

❌ Before (Legacy Testing):

func TestFoo(t *testing.T) {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()
    doSomething(ctx)
}

func BenchmarkBar(b *testing.B) {
    for i := 0; i < b.N; i++ {
        doWork() // 编译器可能会过度优化这里的代码
    }
}

✅ After (Modern Go 1.24):

func TestFoo(t *testing.T) {
    // 自动随测试结束而取消的 Context
    ctx := t.Context()
    doSomething(ctx)
}

func BenchmarkBar(b *testing.B) {
    // 防止编译器优化掉内部逻辑的全新循环方式
    for b.Loop() {
        doWork()
    }
}

JSON 标签终极补丁 (omitzero)

长久以来,JSON 的 omitempty 标签对 time.Time 和嵌套 struct 这种“非空即零”的类型无效(因为它们永远不是 nil)。Go 1.24 终于引入了 omitzero。

✅ Modern Go 1.24:

type User struct {
    // 以前:即使时间是 0001-01-01 也会被序列化输出
    // 现在:只要是零值,就忽略
    CreatedAt time.Time json:"created_at,omitzero"
}

零分配迭代分割 (strings.SplitSeq)

当你只需要遍历分割后的字符串,而不需要将其存入切片时,迭代器能帮你省下所有内存分配。

  • ❌ Before (Allocates memory): for _, part := range strings.Split(s, “,”) { … }
  • ✅ After (Zero allocation): for part := range strings.SplitSeq(s, “,”) { … }

第五阶段:属于现在的未来(Go 1.25 – Go 1.26)

让我们来看看最近两个发布版本实装的黑科技。

拯救 WaitGroup (wg.Go())

Go 1.25 消除了并发控制中最常见的 Bug:忘记写 wg.Add(1) 或者忘记 defer wg.Done()。

❌ Before (Legacy):

var wg sync.WaitGroup
for _, item := range items {
    wg.Add(1)
    go func(i Item) {
        defer wg.Done()
        process(i)
    }(item)
}
wg.Wait()

✅ After (Modern Go 1.25):

var wg sync.WaitGroup
for _, item := range items {
    // 自动处理 Add(1) 和内部的 Done(),连闭包变量捕获问题都不用再担心
    wg.Go(func() {
        process(item)
    })
}
wg.Wait()

指针获取的终极解法 (new(expr))

在 Go 1.26 中,为了给结构体的指针字段(常见于 Protobuf/JSON 生成的代码)赋值,你再也不需要写恶心的辅助函数了。new() 终于支持了表达式。

❌ Before (Legacy):

timeout := 30
debug := true
cfg := Config{
    Timeout: &timeout, // 必须先单独声明变量
    Debug:   &debug,
}

✅ After (Modern Go 1.26):

cfg := Config{
    Timeout: new(30),   // 推断为 *int
    Debug:   new(true), // 推断为 *bool
    Role:    new("admin"), // *string
}

警告:请直接写 new(30),千万不要写 new(int(30)) 这种脱裤子放屁的类型转换,编译器足够聪明。

泛型安全类型断言 (errors.AsType)

处理自定义错误时,errors.As 极易用错,因为它需要传入一个指针的指针,如果传入非指针会在运行时直接 Panic。Go 1.26 用泛型完美解决了它。

❌ Before (Unsafe):

var pathErr *os.PathError
// 极易漏写 & 导致 panic
if errors.As(err, &pathErr) {
    handle(pathErr)
}

✅ After (Modern Go 1.26):

// 编译期类型安全,返回具体的实例
if pathErr, ok := errors.AsType[*os.PathError](err); ok {
    handle(pathErr)
}

小结:让 AI 成为代码现代化的推手

回顾这从 Go 1.0 到 1.26 的演进史,我们看到了一条清晰的脉络:Go 官方正在极力消除样板代码(Boilerplate),同时坚定地维持着语言的简单与直白。

JetBrains 开源的这个 use-modern-go Skill 给了我们一个绝佳的启示:在 AI 编程时代,不要让大模型去学习网上那些陈旧的、十年前的 StackOverflow 答案。 通过系统性的 Prompt 引导,我们可以强迫 AI 写出最符合当前语言版本的、最高效的 Modern Code。

作为 Gopher,是时候给你的脑海中的“Go 语言编译器”升个级了。下一次敲下代码时,问问自己:“这是 2015 年的写法,还是 2026 年的写法?”


你的代码里还有“老古董”吗?

哪怕 Go 1.26 已经发布,很多人的 go.mod 依然停留在 1.16 甚至更早。在这些 Modern 特性中,哪一个最让你感到“相见恨晚”?你在重构老代码时,遇到过哪些由于“兼容性思维”导致的阻碍?

欢迎在评论区分享你的 Modern Go 实践!


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

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

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


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

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

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

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

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


想系统学习Go,构建扎实的知识体系?

我的新书《Go语言第一课》是你的首选。源自2.4万人好评的极客时间专栏,内容全面升级,同步至Go 1.24。首发期有专属五折优惠,不到40元即可入手,扫码即可拥有这本300页的Go语言入门宝典,即刻开启你的Go语言高效学习之旅!


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

AI 时代的开源:当 Coding Agent 接管 GitHub,我们该何去何从?

本文永久链接 – https://tonybai.com/2026/03/01/open-source-ai-era-coding-agent-takes-over-github

大家好,我是Tony Bai。

如果我们把时间拨回到 2023 年之前,一个开源项目的诞生往往伴随着一位或几位核心维护者(Maintainer)数周甚至数月的辛勤耕耘。

但在刚刚过去的几个月里,我们见证了一种全新的物种崛起。

OpenClaw(其前身是火遍全网的 Moltbot/Clawdbot)为代表,这类项目的代码库中,接近 100% 的代码都是由 AI Coding Agent(如 Claude Code等)编写的。甚至连最初的 README、项目结构、测试用例,都是由 AI 在几分钟内“吐”出来的。

这是一个极其震撼的信号!它意味着,代码的生产成本正在趋近于零。

Gastown、Beads 等由 Agent 驱动的项目如雨后春笋般涌现,GitHub 上的 Commit 频率开始呈现出非人类的特征——一个小项目可能在一天内产生数百次提交,每一次都包含了完整的逻辑和测试。

近期,SemiAnalysis也曝出一个惊人数据:目前,GitHub上4%的公开提交(commits)都是由Claude Code生成的,到了2026年底这个数字将达到20%以上。

这种Coding Agent生产力的“核爆”,正在对我们熟悉的开源世界发起一场降维打击。Github开源的那个被奉为圭臬的 opensource.guide,其中的许多条款在今天看来,似乎已经过时了。

当 Coding Agent 开始接管 GitHub,传统的“人-人”协作模式将面临怎样的崩塌与重建?我们,作为人类开发者,又该何去何从?

旧秩序的崩塌:信任与注意力的危机

开源社区的基石,建立在两个稀缺资源之上:人类的时间 和 人与人之间的信任。

在过去,当你向一个项目提交 PR(Pull Request)时,维护者默认会认为:你付出了时间,你阅读了代码,你是来帮忙的。这种“工作量证明(Proof of Work)”构建了基本的信任。

但在 Coding Agent 时代,这个逻辑被打破了。

垃圾 PR 的洪流 (Spam PRs)

现在的贡献者,可能只是在 Cursor 或 Claude Code等Coding Agent 里输入了一句:“帮我给这个项目加个功能。”

几秒钟后,一个包含几百行代码的 PR 就生成了。

贡献者可能根本没看懂代码,甚至没跑过测试,就直接点击了 Create Pull Request。

对于维护者来说,这是一场灾难。你面对的不再是带着诚意的贡献者,而是成千上万个不知疲倦的“Prompt 搬运工”。

人工 Review 的物理极限

人类阅读代码的速度,是有生理极限的。

当 AI 一天能生成人类一年才能写完的代码量时,“人工 Code Review” 这个环节彻底瘫痪了。

即使维护者 24 小时不睡觉,也无法审核完那些由 Agent 生成的、逻辑似是而非的代码。

贡献者的异化

传统的开源贡献者,通过阅读源码、理解架构来提升自己。

现在的部分贡献者,变成了“刷单机器”。他们关心的不是项目本身,而是 GitHub Profile 上的绿色格子。

当贡献不再代表能力,而只代表算力时,开源社区的荣誉体系也随之崩塌。

开源 2.0 的新法则:机器优先治理

面对这场危机,我们不能坐以待毙。开源社区必须进化出一种新的秩序——开源 2.0。 在这个新时代,核心法则将从“以人为本”转向“机器优先(Machine-First)”。

法则一:Agent 审查 Agent

既然人类无法处理机器生成的洪流,那就让机器去对抗机器。 未来的开源项目,将标配一个 “守门员 Agent” (Gatekeeper Agent)。

  • 当 PR 提交时,首先迎接它的不是人类,而是守门员冷酷的扫描。
  • 它会运行测试,检查代码风格,甚至进行逻辑推理(这一点尤为重要):“这段新增的代码是否与项目的架构原则冲突?”
  • 只有通过了守门员预审的 PR,才会被打上 human-review-needed 的标签,呈现在人类面前。

这不再是简单的 CI/CD,这是具备认知能力的 AI 门卫。

法则二:规范即源码

在 AI 时代,提交代码(Implementation)可能不再是最高效的协作方式。

因为代码是廉价的,是易变的。真正昂贵且恒定的,是意图(Intent)和约束(Constraint)。

未来的开源贡献,很大可能会演变成:

  • 提交 Spec:“我希望增加一个 User 模块,接口定义如下…”
  • 提交 Test Case:“这是一个复现 Bug 的测试用例…”

维护者的 Agent 接收到这些 Spec 后,会自动生成实现代码。

“与其给我鱼(代码),不如给我渔网(Spec)。”,或者说 **“Do not show me your code, Show me your spec”。这将彻底改变 Git 的协作流。

法则三:声誉协议的重构

我们需要一套新的机制来识别“高质量贡献者”。

仅仅看 Commit 数量已经没有意义了。未来的 GitHub 可能会引入基于 AI 评估的声誉分。

  • 你的 PR 是否一次性通过了 Agent 审查?
  • 你的代码是否被下游项目广泛引用?
  • 你的 Spec 是否具有创新性?
  • … …

灵魂拷问:我们为什么还要开源?

这可能是最深层的存在主义危机。

如果每个人都有一个全能的 Coding Agent,只需要说一句“我要一个高性能 HTTP 路由库”,AI 就能现场写出一个完美的版本(甚至根据你的业务场景定制),那么——我们还需要开源 express 或 gin 吗?

当代码的边际生产成本归零,传统的“共享代码以复用”的经济学基础就被动摇了。

悲观视角:开源库的贬值

通用的、工具性质的开源库(Utils, Helpers),可能会大量消亡。因为 AI 现场生成的成本,比你去 GitHub 搜索、安装、阅读文档的成本还要低。“即时软件(Just-in-Time Software)” 将成为现实。

乐观视角:开源的本质回归

但开源不会死。因为开源的本质不是共享代码,而是共享智慧。

我们依然需要共享:

  • 架构模式 (Architecture Patterns):如何组织复杂的系统?
  • Agent Skills (智能体技能):如何教会 AI 完成特定任务?
  • 评估标准 (Benchmarks):什么是好的代码?

未来的开源,将很可能从“代码托管”进化为“智能体能力托管”。GitHub 可能会变成一个巨大的 Agent Hub,我们在这里分享 Prompt、分享 Context、分享让 Agent 变得更聪明的知识。

平台的进化:GitHub 的自我救赎

作为开源的基础设施,GitHub(或者它的挑战者)必须做出改变,以迎合 Coding Agent 时代。

我们不妨大胆预测一下 GitHub 的未来功能:

  • AI Gatekeeper 集成:仓库设置里增加一个“开启 AI 预审”的开关。
  • Semantic Search(语义搜索):传统的关键词搜索在海量生成的代码面前已经失效。我们需要“意图搜索”——“帮我找一个能处理 PDF 解析且兼容 Python 3.12 的 Agent Skill”
  • Interactive README:README.md 不再是静态文档,而是一个Chat Interface。你可以直接问项目:“怎么安装?”“报错了怎么办?” 项目自带的 Support Agent 会回答你。
  • A2A Protocol 支持:GitHub 可能会标准化 Agent-to-Agent 的协作协议或演进现有的A2A协议,让不同项目的 Agent 能够跨仓库协作(例如:依赖更新 Agent 自动向你的项目提交 PR)。

小结:最后的守夜人

在这个机器轰鸣、代码如洪流般涌现的时代,人类维护者将成为“最后的守夜人”。

我们的职责不再是亲自砌每一块砖(写代码),也不再是亲自检查每一块砖的纹理(Review 代码)。

我们的职责是:定义蓝图(Spec),设定标准(Evaluation),以及在机器迷失方向时,握住方向盘(Alignment)。

未来开源并不会死,它只是进化了。

它从一群手工匠人的集市,进化成了一座高度自动化的未来城市。而我们,是这座城市的规划师。


你的“开源”新角色

开源的 2.0 时代正在开启。作为开发者或维护者,你更看好“规范即源码”的协作模式,还是依然怀念那种“人与人、面对面”的代码交流?你认为 AI 带来的 PR 洪流是加速了项目的进化,还是仅仅制造了更多的数字噪音?

欢迎在评论区分享你的真实感受与预判!让我们一起探讨如何在机器的时代守住人的智慧。

如果这篇文章引发了你对职业未来的深思,别忘了点个【赞】和【在看】,并分享给那些依然奋斗在 GitHub 第一线的战友们!


构建你的开源防御体系

在这个开源新秩序建立的前夜,作为一个开发者,你该如何适应? 是继续用肉身对抗机器的洪流,还是学会构建自己的 Agent Guardrails?

在我的极客时间专栏《AI原生开发工作流实战》中,我们将深入探讨:

  • AI Code Reviewer 实战:如何利用 Claude CodeGitHub Actions 构建自动审查流水线?
  • Spec-Driven Contribution:如何设计一套基于 Spec 的开源贡献规范?
  • Agent Skills 开发:如何将你的经验封装成 Skill,发布到未来的开源市场?

不要被时代抛弃。扫描下方二维码,掌握驾驭机器军团的能力。


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

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

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

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

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


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

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! 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