编程 Go 1.28 开发分支:复合字面量按目标类型省略,函数参数、append、switch 已支持

2026-11-12 21:03:06

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、73bc5e8ef6struct literals
c33ea07d92function calls
d87b733482target may hold any type
b0434e1e9atarget.sig 返回 Type
f1220f3337delete
08a51e4d9bappend
96ef5b334ccopy
205624aac7switch
430d19f07acomparing 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 literals
  • 7ccdc93ad4:测试

背景:从路线图到实现

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/
复制全文 生成海报 Go 语言提案 类型推断 编译器

推荐文章

程序员茄子在线接单