惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Blog — PlanetScale
Blog — PlanetScale
J
Java Code Geeks
N
Netflix TechBlog - Medium
Martin Fowler
Martin Fowler
A
About on SuperTechFans
腾讯CDC
B
Blog RSS Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Microsoft Azure Blog
Microsoft Azure Blog
D
Docker
Y
Y Combinator Blog
Microsoft Security Blog
Microsoft Security Blog
F
Fortinet All Blogs
I
InfoQ
博客园 - 【当耐特】
美团技术团队
GbyAI
GbyAI
量子位
宝玉的分享
宝玉的分享
爱范儿
爱范儿
有赞技术团队
有赞技术团队
博客园 - Franky
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志

博客园 - 丁少华

adb提取本机apk 安卓ADB调试安卓 高德地图车机版本9.5制作共存 Taskfile 拆分子文件 go项目的taskfile Go 内嵌网页 windows的终端像mac一样好用 pgsql指定用户看到某个表 vue不使用根组件 Huma + Orval 前后端 API 自动生成方案 Mac安装nginx 代码写错分支拯救指南 React UI 库推荐 Loop Engineering Vue 3 UI 组件库 Neon白嫖免费pgsql 域名利用cloudflare免费图床 nginx反代CloudflarePages提示502 vite使用shadcn vite使用biome Window下Nginx winserver2022安装不上软件 mac已损坏无法打开 代码高亮 命令运行器之task 命令运行器之just windows开启wsl 白嫖Redis 白嫖MongoDB vercel无服务函数
不喜欢Go的几点
丁少华 · 2026-07-31 · via 博客园 - 丁少华

随着对Go这门语言的深入,觉得它很多高级特性都没有,很多时候就像是纯粹的搬砖,比js还js,生产力堪比原始人。我目前感受到的Go 语言缺陷/痛点整理成一份清单。并觉得站在现代语言和工程开发的视角,这些设计也确实构成了 Go 的核心缺点与痛点:


1. 架构与抽象能力匮乏

  • 缺少真正意义上的面向对象(无继承)
    只有组合(Embedding),缺乏多态和重用的优雅路径。面对复杂的领域模型(DDD)时,代码容易沦为扁平的结构体堆砌,无法构建清晰的类层级关系。
  • 缺乏元编程与动态增强能力(无注解/AOP 切面)
    无法做无侵入式的切面增强与横切关注点抽取(如事务管理、权限校验、日志打点)。所有非业务逻辑必须显式硬编码进业务函数中,导致架构强侵入。
  • 缺乏基于注解的声明式依赖注入(无原生 IoC/DI)
    无法像现代语言框架那样通过 @Autowired / @Inject 自动装配依赖和生命周期。开发者不得不通过手动书写大量的 NewXX() 工厂方法去层层构建和传递依赖树,导致大量的初始化样板代码。
  • 反射(Reflection)体验极差且性能低下
    虽然提供 reflect 包,但 API 极其繁琐、类型安全无法在编译期保证、且运行时性能开销大,很难像 Java/C# 那样写出轻量丝滑的动态框架。

2. 代码冗长与“机械劳动”

  • 错误处理极其原始(遍地 if err != nil
    没有 try-catch 异常冒泡机制,每一个可能报错的函数都必须手动检查。这导致业务代码中 30%~50% 的篇幅都在重复写错误判断,破坏逻辑连贯性,阅读时极易产生视觉疲劳。
  • 缺乏构造函数与工厂语法糖
    没有 constructor 关键字,无法在语言层面保证结构体初始化的完整性和合法性。必须依靠开发者手动书写 NewXX() 工厂函数,极易漏写或忘记调用。
  • 显式接口校验的语法套路古怪
    隐式接口(鸭子类型)虽然解耦,但为了在编译期强制确保某个结构体实现了特定接口,不得不使用 var _ Package.Interface = (*Struct)(nil) 这种晦涩的黑魔法代码。

3. 作用域与模块化局限

  • 隔离粒度粗糙(仅支持包级隔离)
    只有 Package(文件夹)级别的可见性控制(大写导出、小写私有)。文件之间没有真正的私有作用域,同包下的文件可以随意互相访问内部细节,难以实现更细粒度的封装。

4. 语法糖与表达力欠缺

  • 泛型实现尴尬且语法臃肿
    为了兼容已有语法,泛型采用了中括号 [T],在涉及复杂索引或数组嵌套(如 slice[i] 结合泛型 xx[xx])时,括号重叠严重,可读性极差。且泛型功能受限,缺乏高级类型演算能力。
  • 开发体验缺乏“现代感”
    缺乏优雅的函数式操作(如 Stream 流、管道运算符 |>、链式调用),简单的 map/filter/reduce 操作在 Go 中都需要手写 for 循环。

5. 霸道的生态与排他性规范

  • 极其强势且单一的格式化标准(gofmt
    抹杀了开发者的代码风格自由。顶级声明之间强制空行、函数注释必须强制以函数名开头等规范被硬编码进工具链,不遵循就无法编译或会被编辑器强制覆写。

总结

一门语言如果为了“防范低级程序员出错”和“方便大公司管理流水线”,而把高级抽象手段全部斩断,那它就必然要承受“表达力低下、开发体验原始”的代价。

觉得它像“未开化”,是因为现代语言(如 Rust、TypeScript、Kotlin、Java)都在试图通过更强悍的编译器和更丰富的语法糖来同时兼顾“安全性”与“开发爽感”;而 Go 选择了一条极端的路——直接放弃高阶抽象,用粗暴的“原始”来换取简单。

虽然 Go 的设计者试图用“极简、显式、强规范”来消灭黑盒魔法、降低大厂团队的看码与维护成本;但是这种拒绝 @Autowired 声明式注入、动态 AOP 和语法糖的极端“防呆”设计,也彻底剥夺了现代语言的抽象与表达力,让开发者不得不承担手写依赖树、横切逻辑强侵入业务代码,以及到处都是样板代码的生产力损耗。