语言设计
Misc
- design/go0initial Rob Pike、Robert Griesemer、Ken Thompson,Go 语言注释规范,2008年3月3日。
- design/go0spec0 Go 编程语言,语言规范。2008年3月7日。
- design/go0semicolon Rob Pike,Go 中的分号。2009年12月10日。
- design/go11func Russ Cox,Go 1.11 函数调用。2013年2月。
- design/go11return Russ Cox,Go 函数最后的 Return 要求。2013年3月。
- design/go12nil Russ Cox,Go 1.2 字段选择和空检查。2013年7月。
- doc/go13todo Go 1.3 待完成列表。2014年6月1日。
- doc/goatgoogle Rob Pike,谷歌 Go 使用 - 语义。2012年10月25日。
- doc/makego Andrew Gerrand,Go 怎样创建的。2015年7月9日。
- discuss/go1preview Russ Cox。Go 1 预览版。 2011年。
- design/overlapping-interfaces Robert Griesemer 提案:允许将接口嵌入折叠方法集。2019年10月16日。
- issue/6977 规则:允许嵌入重叠接口
- design/struct-conversion Robert Griesemer 提案:struct 类型转换忽略 tag。2016年6月16日。
- issue/16085 提案:struct 类型转换忽略 tag
- design/go2trans Ian Lance Taylor 提案:Go 2 变迁。2018年10月15日。
- design/signed-int-shift Robert Griesemer 提案:在 Go 2 中允许有符号整数进行移位计算。2019年1月17日。
- issue/19113 提案:规范:允许有符号整数进行移位计算。
- design/number-literal Russ Cox、Robert Griesemer 提案:Go 2 数学字面量。2019年3月6日。
- issue/12711 提案:不同的八进制字面量表示
- issue/19308 提案:规范:二进制字面量
- issue/28493 提案:允许在数字中使用
_ - issue/29008 提案:Go 2 十六进制浮点数
- issue/33502 提案:审查会议记录
- issue/33892 提案:审查 Go 2 会议记录
- issue/19623 提案:规范:更改 int 为任意精度
- issue/19367 unsafe:添加
Slice(ptr *T, len anyIntegerType) []T - issue/40481 unsafe:添加函数
- issue/46505 规范:允许从切片转换为数组
- issue/9859 规范:在结构体字面量中直接引用嵌入字段
切片 (1.2)
- design/read-only-slices Brad Fitzpatrick,只读切片。2013年5月13日。
- design/read-only-slices-russ Russ Cox,只读切片的评价。2013年5月。
- design/go12slice Russ Cox,Go 切片的容量。2013年6月。
- design/multidim-slice Brendan Tracey,提案:多维切片。2016年11月17日。
- issue/41239 运行时:
append的增长让人意外。 - discuss/why-slice-grow 为什么切片长度会在 1024 后以25%的速度增长?
- cl/347917 运行时:让切片增长公式更平滑。
- doc/cl-347917-graph CL 347917 图表
包管理 (1.4, 1.5, 1.7)
- design/go14internal Russ Cox,Go 1.4
Internal包,2014年6月。 - design/go14nopkg Russ Cox,Go 1.4
src/pkg→src,2014年6月。 - design/go14customimport Russ Cox. Go 1.4 自定义路径导入检查。2014年6月。
- design/go15vendor Russ Cox,Go 1.5 Vendor 实验,2015年7月。
- design/go17binarypkg Russ Cox,提案:纯二进制包,2016年4月24日。
- issue/2775 cmd/go:当二进制可用但源文件丢失。
类型别名 (1.9)
- design/type-alias Russ Cox、Robert Griesemer 提案:类型别名。2016年12月16日。
- talk/type-alias 2016年 GopherCon —— 快速谈话:Robert Griesemer - Go 别名说明,建议。2016年10月9日。
- issue/16339 提案:Go 别名说明。
- issue/18130 所有:支持渐进式代码修复,同时在包之间移动类型。
- talk/refactor-video + [doc/refactor](https://talks.go.dev/2016/refactor.article) Russ Cox,重构代码库(在 Go 的帮助下)。
Russ Cox,重构代码库(在 Go 的帮助下)。2016年 GothamGo,2016年11月18日。
Summary:在 Russ Cox 题为“GothamGo 2016 代码库重构(在 Go 的帮助下)”的播客节目中,讨论了在 Go 中使用大型代码库的挑战以及可扩展性的重要性。 Cox从早期就参与了Go编程语言的开发,他分享了他对Go如何更好地协助代码包结构重构的见解。这一集首先强调了处理大型代码库(例如 Google 的单一存储库)时所面临的挑战,并强调了高效导入和最小化不必要依赖项的必要性。 Cox 解释了将代码拆分为单独包的原因,其中包括提高可管理性和减少依赖性。 Cox 随后讨论了代码库重构的过程,建议将其分为三个阶段:进行初步更改、更新代码以使用新 API 以及删除旧 API。这种渐进的方法可以更轻松地审查和提交较小的提交,特别是在处理分布在多个存储库中的代码时。该播客还深入探讨了在 Go 编程中实现可互换性的挑战。虽然函数和类型可以定义为可互换的,但将类型从一个包移动到另一个包会带来限制。 Cox 提到了 2011 年实施的解决方案,但表示它可能并不理想。他还强调了 Kubernetes 项目在代码库中移动类型时面临的困难。 Cox 提议添加一种机制来为类型创建可互换的名称,并强调 Go 需要支持逐步代码修复以在包之间移动类型。 他对有关此事的意见表示感谢,并提到正在重新评估类型别名的包含,以确定适当的行动方案。总的来说,该播客提供了有关在 Go 中使用大型代码库的挑战的宝贵见解,并提供了改进代码库重构和实现可互换性的建议。
- design/alias-decls Robert Griesemer、Rob Pike,提案:Go 的别名声明。2016年7月18日。
- issue/76472 在 1.27 中移除 gotypesalias 和 asynctimerchan 两个 GODEBUG 设置
- issue/17487 cmd/compile:支持别名
- issue/67547 go/types,types2:审查类型断言中潜在的 Alias 缺陷
- issue/65294 x/tools:使测试在 GODEBUG=gotypesalias=1 下通过
- doc/alias-names Robert Griesemer,(别名)名字里有什么?2024年9月17日。
Defer (1.14)
- design/open-defer Dan Scales、Keith Randall、and Austin Clements 提案:通过内联代码进行低成本 defer,以及额外管理 panic。2019年9月23日。
- issue/6980 cmd/compile:在栈帧中分配一些 defer。
- issue/14939 运行时:defer 很慢
- 未解决的
defer recover()边缘案例- issue/10458 规范:panic 在极端情况下的语义
- issue/23531 规范:在嵌套 defer 中使用
recover() - issue/26275 规范:在使用 defer 的函数中记录调用者的行为
- issue/34530 规范:澄清何时调用 recover 停止 panic
- cl/189377 规范:列举 recover 行为和递归 panic 的详情。
- issue/34481 cmd/compile,运行时:通过内联代码实现低成本 defer 的设计
错误值 (1.13)
- doc/err2011 Andrew Gerrand,Go 错误处理。2011年7月。
- doc/err-values Rob Pike。错误是值,2015年1月。
- doc/err-philosophy Dave Cheney,我处理错误的理念。2016年4月。
- doc/err-gracefully Dave Cheney,不要只检查错误,而是优雅处理。2016年4月。
- doc/err-stacktrace Dave Cheney,堆栈跟踪和错误包,2016年6月12日。
- doc/err-upspin Rob Pike,Upspin 的错误处理。2017年12月6日。
- doc/err-work Damien Neil 和 Jonathan Amsterdam,Go 1.13 中处理错误,2019年10月17日。
- design/err-handling-overview Russ Cox,错误处理——问题综述。
- doc/err-value-faq Jonathan Amsterdam 和 Bryan C. Mills 错误值:常见问题。2019年8月。
- design/err-handle-check Marcel van Lohuizen,错误处理——设计草稿。2018年8月27日。
- design/err-try Robert Griesemer 提案:Go 内置错误检查函数
try, 2019年6月12日。- issue/32437 提案:Go 内置错误检查函数
try。判定回复。
- issue/32437 提案:Go 内置错误检查函数
- issue/71203 提案:规范:用
?减少错误处理的样板代码 - design/err-inspect Jonathan Amsterdam、Damien Neil,错误检查——设计草稿,2018年8月27日。
- design/err-values-overview Russ Cox,错误处理——问题综述。2018年8月27日。
- design/error-values Jonathan Amsterdam、Russ Cox、Marcel van Lohuizen、Damien Neil 提案:Go 2 错误检查。2019年1月25日。
- issue/29934 Jonathan Amsterdam 提案:Go 2 错误检查。2019年1月25日。
- issue/29934-decision Damien Neil。Go 1.13 关于错误值的决定。2019年5月6日。
- issue/29934-russ Russ Cox,关于“提案:Go 2 错误检查”的回复。2019年5月7日。
- design/err-print Marcel van Lohuizen,错误打印——设计草稿。2018年8月27日。
- issue/30468 errors: 新版本的性能衰退。
- issue/40432 语言:Go 2: 错误处理的讨论
- issue/40776 提案:动态错误忽略的检测器
- issue/41198 提案:errors:添加 ErrUnimplemented 作为失败接口方法的标准方式。
- discuss/71460 Ian Lance Taylor,讨论:规范:使用 ? 减少错误处理的样板代码。2025年1月27日。
通道、选择器
- design/lockfree-channels Dmitry Vyukov,Go 通道。2014年1月28日。
- issue/8899 运行时:无锁通道。
- discuss/lockfree-channels 无锁通道的更新。
- cl/112990043 运行时:选择器中的锁粒度
- cl/110580043 运行时:在非阻塞通道操作中添加快速路径
- issue/8898 运行时:特殊案例,计时器通道。
- issue/37196 时间:在停止或重置返回后,让 Timer/Ticker 通道不接受旧值。
- issue/8903 运行时:让通道更快生成。
- issue/21806 选择语句的公平性。
- issue/40410 从 scase 中去除不必要的字段
- issue/40641 运行时,在堆栈收缩和通道发送/接受之间的竞争导致错误的 sudog 值
- issue/37350 反射:如果数组长度大于 1<< 16,请 panic
泛型
- doc/generics-discuss Go 泛型讨论摘要
- doc/generics-dilemma Russ Cox,对泛型很犹豫。2009年12月3日。
- design/type-functions Ian Lance Taylor,类型函数。2010年6月。
- design/generalized-types Ian Lance Taylor,通用类型。2011年3月。
- design/code-gen Russ Cox,Go 中动态代码生成的替代。2012年9月。
- design/generalized-types2 Ian Lance Taylor,Go 中的通用类型,2013年10月。
- design/type-parameters Ian Lance Taylor,Go 中的类型参数,2013年12月。
- design/compile-time-function Bryan C. Mills,编译时函数和一等类型。2016年9月。
- design/should-generics Ian Lance Taylor,Go 应该有泛型。2011年1月。
- design/should-generics2 Ian Lance Taylor,Go 应该有泛型。更新:2016年4月。
- issue/15292 提案:规范:通用编程工具。
- design/generics-overview Russ Cox,泛型——问题综述。2018年8月27日。
- design/contracts Ian Lance Taylor, Robert Griesemer,合同——设计草案。2018年8月27日,更新:2019年7月31日。
- cl/187317 原型实现
- paper/featherweight-go Griesemer, Robert 等,轻量级 Go。arXiv 预印本 arXiv:2005.11710 (2020).
- talk/featherweight-go Phil Wadler:轻量级 Go,2020年6月8日。
- design/type-parameters2 Ian Lance Taylor, Robert Griesemer。类型参数——设计草稿。2016年6月16日,更新:2020年8月28日。
- cl/dev.go2go dev.go2go 分支
- doc/type-check-readme 类型检查
- doc/type-check-notes 这个文件服务器作为笔记或实现日志
- discuss/generics-parenthesis Robert,泛型和括号
- issue/33232 提案:Go 2:为 interface{} 添加任意别名
- discuss/generics-move Ian,继续泛型设计。
- discuss/generics-implementation 实现泛型
- design/generics-implementation-stenciling 泛型实现——模板
- design/generics-implementation-dictionaries 泛型实现——字典
- issue/43651 提案:规范:使用类型参数添加泛型编程
- design/type-parameters3 类型参数建议
- issue/45346 提案:规范:泛型:使用类型集合删除类型中的类型关键字
- issue/46477 提案:规范:泛型:别名中的类型参数
- 使用泛型的标准库
- issue/45458 提案:约束:定义标准类型参数约束的新包
- discuss/47319 提案:约束:定义标准类型参数约束的新包(讨论)
- issue/45955 提案:切片:提供泛型切片函数的新包
- discuss/47203 提案:切片:提供泛型切片函数的新包(讨论)
- discuss/47331 提案:容器/集合:提供泛型集合类型的新包(讨论)
- discuss/47330 提案:maps:提供泛型 map 函数的新包(讨论)
- issue/47657 提案:sync,sync/atomic:添加 PoolOf, MapOf, ValueOf
- issue/70128 规范:移除核心类型(core type)的概念
- issue/60994 提案:go/types:添加 func CommonUnderlying(Type) Type(原名 CoreType)
- issue/56548 规范:允许基本接口类型实例化 comparable 类型参数
- design/parameterized-go-types Rob Findley、Robert Griesemer,为支持类型参数而对 go/types 所做的扩展。2021年8月17日。
- issue/12854 规范:可推断类型的复合字面量
- issue/77245 规范:函数类型推断应适用于所有赋值上下文
- issue/61035 go/types,types2:修正 SizesFor("gc", ...),使其与 gc 的实际行为一致
- issue/52728 go/types:保证通过 API 可达的不同实例数量有限
- issue/57192 规范:方法集大小不同的接口永远无法合一(但其实可能可以)
- issue/63974 go/types,types2:在编译器能够使用 go/version 后改用它
- issue/51343 go/types,types2:简化带类型参数的方法接收者的类型检查
- issue/55326 go/types,types2:消除类型检查器与编译器错误信息之间的差异
- issue/54511 types2,go/types:共享测试
- issue/69673 go/types:与位置无关的类型检查
- issue/57410 cmd/compile:移除 GOEXPERIMENT=nounified
- issue/68778 exportdata:支持带类型参数的别名
- doc/comparable Robert Griesemer,所有可比较的类型。2023年2月17日。
- doc/deconstructing-type-parameters Ian Lance Taylor,解构类型参数。2023年9月26日。
- doc/type-inference Robert Griesemer,关于类型推断你想知道的一切,以及更多。2023年10月9日。
- doc/generic-slice-functions Valentin Deleplace,健壮的切片泛型函数。2024年2月22日。
- doc/coretypes Robert Griesemer,再见核心类型,你好,我们熟悉和喜爱的 Go!2025年3月26日。
- doc/generic-interfaces Axel Wagner,泛型接口。2025年7月7日。
- issue/75883 规范:移除类型参数的循环限制
- doc/type-construction Mark Freeman,类型构造与循环检测。2026年3月24日。
- doc/generic-methods Mark Freeman,泛型方法。2026年8月26日。
- talk/axel2024 Axel Wagner,高级泛型模式。GopherCon 2024,芝加哥。2024年7月。
迭代器
- issue/24282 提案:Go 2:改进 for 循环的易用性
- issue/40605 提案:Go 2:迭代器
- issue/43557 提案:Go 2:以函数值作为迭代器
- issue/47707 提案:Go 2:规范:对已定义类型使用 for range
- issue/48567 提案:使用通道作为迭代器
- issue/50112 提案:Go 的集合包与迭代器设计
- issue/54047 提案:Go 2:添加新的迭代器语法、包和接口
- discuss/54245 讨论:标准迭代器接口
- issue/20733 提案:规范:在每次迭代中重新定义 range 循环变量
- issue/56010 重新定义 for 循环变量的语义
- issue/60078 规范:不易出错的循环变量作用域
- discuss/56413 通过对函数值使用 range 实现用户自定义迭代
- issue/61405 提案:规范:添加对整数和函数的 range
- doc/coro Go 的协程
- doc/undefined-behavior C 和 C++ 将性能置于正确性之上
- issue/54650 x/exp/slices:Delete 存在内存泄漏
- issue/66455 提案:errors:添加 All 和 AllAs 迭代器
- issue/61898 提案:x/exp/xiter:提供迭代器适配器的新包
- issue/65236 规范:允许对函数使用 range 时省略迭代变量
- issue/61899 slices:添加迭代器相关函数
- issue/61897 iter:用于迭代器的新包
- issue/61900 maps:添加迭代器相关函数
- issue/61901 bytes,strings:为现有函数添加迭代器形式
- issue/65237 规范:为对函数使用 range 编写文档
- design/loopvar 提案:不易出错的循环变量作用域。
- issue/57969 cmd/compile:添加 GOEXPERIMENT=loopvar
- issue/61717 cmd/compile:在 GOEXPERIMENT=range 下添加新的 range 语义
- doc/loopvar-preview David Chase、Russ Cox,修复 Go 1.22 中的 for 循环。2023年9月19日。
- doc/range-functions Ian Lance Taylor,对函数类型的 range。2024年8月20日。
- issue/61902 regexp:为匹配方法添加迭代器形式
兼容性
- doc/go1compat Go 1 与 Go 程序的未来
- discussion/55090 扩展 Go 的向后兼容性
- issue/56986 Go 的扩展向后兼容性
- design/godebug 提案:Go 的扩展向后兼容性
- discussion/55092 扩展 Go 的向前兼容性
- issue/57001 Go 的扩展向前兼容性
- design/gotoolchain 提案:Go 的扩展向前兼容性
- issue/33791 提案:为重大变更添加明确的决策文档
- issue/28221 cmd/go,cmd/compile:记录语言版本以支持语言过渡
- issue/31793 go/types,types2:为不同的语言版本提供配置支持
- doc/compat Russ Cox,向后兼容、Go 1.21 与 Go 2。2023年8月14日。
- doc/toolchain Russ Cox,Go 1.21 的向前兼容与工具链管理。2023年8月14日。
- issue/65573 cmd/go:将默认 GODEBUG 与 go 语言版本分离
- issue/76163 移除 GODEBUG 标志的策略
- discuss/80580 Austin Clements,更健全的提案流程。2026年7月27日。