ReminderMonday I’ll be building a Go web server during my weekly live stream, following boot.dev’s “Learn Web Servers” course. I hope you can join me
Composite literals
…
Within a composite literal of array, slice, or map type
T
, elements or map keys that are themselves composite literals may elide the respective literal type if it is identical to the element or key type ofT
. Similarly, elements or keys that are addresses of composite literals may elide the&T
when the element or key type is*T
.[...]Point{{1.5, -3.5}, {0, 0}} // same as [...]Point{Point{1.5, -3.5}, Point{0, 0}} [][]int{{1, 2, 3}, {4, 5}} // same as [][]int{[]int{1, 2, 3}, []int{4, 5}} [][]Point{{{0, 1}, {1, 2}}} // same as [][]Point{[]Point{Point{0, 1}, Point{1, 2}}} map[string]Point{"orig": {0, 0}} // same as map[string]Point{"orig": Point{0, 0}} map[Point]string{{0, 0}: "orig"} // same as map[Point]string{Point{0, 0}: "orig"} type PPoint *Point [2]*Point{{1.5, -3.5}, {}} // same as [2]*Point{&Point{1.5, -3.5}, &Point{}} [2]PPoint{{1.5, -3.5}, {}} // same as [2]PPoint{PPoint(&Point{1.5, -3.5}), PPoint(&Point{})}
I like these examples from the spec, but I find the description to be confusing. So let me offer my own phrasing:
In array, slice, and map literals, you can omit the name of the member literal type when it exactly matches the element or key type.
We’ve already seen examples where this works. Here’s one where it doesn’t:
map[string]any{"foo": Point{1,0}} // Cannot be shortened to map[string]any{"foo": {1, 0}}
Quotes from The Go Programming Language Specification Version of August 2, 2023