Go 1.28 开发分支:复合字面量按目标类型省略,函数参数、append、switch 已支持
Go 1.28 的开发分支已经实现了「按目标类型省略复合字面量类型」(type-inferred composite literals),对应提案 golang/go#12854。这个提案由 Damien Neil(neild)在 2015 年提出,至今讨论了十年。
golang.design 的 Go 1.28 runtime & compiler history 页面把这项改动列为 Done,并列出已完成覆盖的上下文及其对应的 CL 编号:
| CL | 覆盖的上下文 |
|---|---|
| 17810c616f、54539e7c9e、c7abbff510、73bc5e8ef6 | struct literals |
| c33ea07d92 | function calls |
| d87b733482 | target may hold any type |
| b0434e1e9a | target.sig 返回 Type |
| f1220f3337 | delete |
| 08a51e4d9b | append |
| 96ef5b334c | copy |
| 205624aac7 | switch |
| 430d19f07a | comparing an untyped composite literal with a typed operand flows the other operand's type in |
仍未确定的部分是:both-untyped or neither-typed comparisons fall back to the usual mechanism(430d19f07a)。也就是说,当比较两侧都没有类型信息时,仍然按原有机制处理。
语法与类型检查侧的改动
a3edc4c682:syntax 支持 untyped composite literals7ccdc93ad4:测试
背景:从路线图到实现
Tony Bai 的《Go 1.28 路线图首度曝光》基于 issue #43930 的会议纪要整理:复合字面量类型省略被列为 Go 1.28 规划中的语言人体工程学改进项,讨论已超过十年。
在此之前,Go 只在切片、数组元素、map 键值等有限场景允许省略类型,例如 []*T{{1}, {2}}。提案希望把「类型可从上下文推断」时的省略扩展到所有能够推断出类型的场合,比如函数参数、变量声明右值。
示例
按提案语义:
type Point struct{ X, Y int }
// 以前必须写全类型
render(Point{X: 1, Y: 2})
// 1.28 语言版本下,形参类型已知时可省
render({X: 1, Y: 2})
// 切片/数组元素本来就允许省略
pts := []Point{{1, 2}, {3, 4}}
// 新增:append / copy / delete / switch / 与有类型操作数比较
pts = append(pts, {5, 6})
delete(m, {1, 2})
使用边界
- 只在目标类型可从上下文推断时成立;两边都没有类型的比较仍走原有规则,不要指望。
- 与泛型函数、类型推断交互时,类型推断在前、省略在后;遇到推断不出目标的写法,仍需写全类型。
- 语言版本随模块
go.mod的go指令走;go指令 < 1.28 的模块仍按旧规则编译。 - Go 1.28 尚未发布(go1.27.0 于 2026-08-19 发布,最新补丁 go1.27.3 于 2026-10-19)。以上内容来自开发快照,最终形态与错误信息以正式 release notes 为准。
验证方式
用开发快照对比同一份文件的语言版本:
go tool compile -lang=go1.27 file.go
go tool compile -lang=go1.28 file.go
这样可以隔离语言版本带来的影响。
链接
- 提案:https://github.com/golang/go/issues/12854
- Go 1.28 runtime & compiler history:https://golang.design/history/runtime-compiler/go1.28.html
- 路线图整理:https://tonybai.com/2026/07/16/go-1-28-roadmap-compiler-and-runtime-features-preview/