Go 1.27 (go.dev)

653 points by database64128 16 hours ago

e4m2 14 hours ago

Not mentioned: Floating-point parsing and formatting now uses Russ Cox's uscale algorithm.

https://research.swtch.com/fp

https://github.com/golang/go/blob/go1.27.0/src/internal/strc...

dolmen 13 minutes ago

jeremyloy_wt 14 hours ago

I’m so happy Russ still contributes even though he isn’t lead anymore. I always enjoy reading his blog posts

dvt 13 hours ago

One of my engineering highlights was Russ reviewing a few of my contributions to Golang (to the core http library). He's a super cool and nice guy. I don't really write that much Go anymore, but it was a fun & cute language when it first came out.

dekdrop an hour ago

dolmen an hour ago

I seriously wonder why this isn't mentioned in release notes.

cornstalks 8 hours ago

I’d love to see how that compares to zmij: https://github.com/dtolnay/dtoa-benchmark

e4m2 25 minutes ago

The upstream fmtlib dtoa-benchmark integrates uscale (https://fmtlib.github.io/dtoa-benchmark/results/). It uses C code from Russ Cox's original fpfmt repository (https://github.com/rsc/fpfmt/tree/main/bench/uscalec), which is slightly different from the Go code upthread.

Zmij and xjb are in a league of their own. Broadly speaking, dtoa first has to find the shortest decimal representation of the floating-point input, and then format that decimal representation into a string. Zmij and xjb pull far ahead of the others mostly by speeding up the second part of that process.

uscale is quite good without the stringification, as are many other algorithms. I would say uscale's main strength isn't its speed, but rather its simplicity and, more importantly, the fact that it does both formatting and parsing using a single ~11 KiB table, which no other state-of-the-art algorithm offers (although yy comes close).

teabee89 15 hours ago

I love how proactive the crypto team is about post quantum. They released https://pkg.go.dev/crypto/mldsa. The lead maintainer Filippo Valsorda wrote a nice piece here[1] to urge the tech world to start deploying good enough versions of post quantum crypto.

[1] https://words.filippo.io/crqc-timeline/

halJordan 15 hours ago

While I'm highly sympathetic to competing priorities crowding out movement to pq cryptography. At the same time it's not sudden at all. It's been 10 years since nist first said "move shit over"?

Valodim 14 hours ago

Yes, and at that time the answer was "move over where?" now it's 2026 and x-wing is a draft still

halJordan 13 hours ago

hoppp 11 hours ago

Yeah the deadline to move everything is drawing near I am actually not impressed by how fast things are going but all progress is good.

calvinmorrison 9 hours ago

its ok we are still rawdogging ftp every day in the business world. The fax machines of the future truly

eterm 13 hours ago

The .NET team have been similarly busy on post-quantum lately, it completely dominated the .NET API reviews for the dotnet 11 release.

It seems there's a big push happening behind the scenes.

pjmlp 37 minutes ago

And Java implementations as well.

stackskipton 12 hours ago

US Government is starting to push hard so code first needs to support it.

amelius 12 hours ago

Ok, but when is it coming to our web browsers and email clients?

Retr0id 12 hours ago

adastra22 9 hours ago

purpleidea 7 hours ago

This person was public on the recent nist list against hybrid solutions. I simply don't understand why they would oppose the safer option. Yes I've read the mailing list, it just all seems quite suspicious.

guessmyname 15 hours ago

Brace for a wave of drive-by pull-requests swapping google/uuid [1] out for the now-standard uuid package [2].

Kubernetes project will be the first one [3] I guarantee it.

[1] https://pkg.go.dev/github.com/google/uuid

[2] https://go.dev/pkg/uuid

[3] https://github.com/kubernetes/kubernetes/blob/2220c3853a2402...

[4] https://github.com/google/uuid/issues/221

iaaan 14 hours ago

Unfortunately for people SELECTing UUIDs out of a DB directly into a uuid struct, the built-in uuid structs don't implement the necessary interface for that, so you'll have to continue using the google package, or a plain string.

agwa 14 hours ago

The database/sql package gained native support[1] for the uuid.UUID type so it will Just Work even without the methods. This probably should have been mentioned in the release notes and database/sql package docs.

[1] https://cs.opensource.google/go/go/+/refs/tags/go1.27.0:src/...

semiquaver 11 hours ago

deepsun 14 hours ago

Or just a number (128-bit).

reactordev 14 hours ago

Oooof… well played go team, well played.

dabber21 14 hours ago

will 'go fix' take care of this?

pjmlp 4 hours ago

Struct literal changes while welcomed, have the issue of being a possible source of bugs, if there are overlapping fields,

type Habitat struct { Burrow string }

type Gopher struct { Name string Burrow string Habitat }

It will not initialise what one expects, here it is a contrived example, however it may not be easy to spot in more complex source code.

https://go.dev/play/p/dsY6tK5S8Ie

Better generics and improved SIMD are nice additions as well.

amiga386 2 hours ago

Go has had this behaviour for promoting fields (provided they don't clash) for some time, this is just extending the language feature to initialisers.

Your contrived example doesn't initialise the embedded struct that also contains a "Burrow" field. If it did that at all, even without naming the Burrow field... you would not be allowed to initialise the struct, because of the ambiguity.

https://go.dev/ref/spec#Composite_literals

> A key must not denote a promoted field inside an embedded struct if that struct is also specified by another key.

> Given the declarations

    type Object  struct { name, color string }
    type Point3D struct { Object; x, y, z float64 }
    type Line    struct { Object; p, q Point3D }
> .... field selectors may not denote overlapping fields:

    obj   := Object{"edge", "black"}
    line3 := Line{Object: obj, name: "diagonal"} // invalid: name denotes a field inside Object

pjmlp an hour ago

Which error?

https://go.dev/play/p/CFWVXkFBOEX

Note that I added a name field to Line.

    Data:  {edge black}  --  {{edge black} {{ } 0 0 0} {{ } 0 0 0} diagonal}
Oops now Object.name is empty, which is my point.

amiga386 an hour ago

j3nz 3 hours ago

I'd say it is as expected https://go.dev/play/p/sy6SMrOiw4y

pjmlp 3 hours ago

I would at least expect a go vet warning in such cases.

0x696C6961 3 hours ago

Mhm, probably worth a golang-ci check for duplicate field names which are accessed by methods on the embedded type.

pjmlp 3 hours ago

Better would be a got vet check.

I understand the need not to break existing code that might have such fields.

0x696C6961 3 hours ago

Xeoncross 15 hours ago

> First, generic methods are now supported > Generic functions can now be used without explicit type arguments

Great! This was an ergonomic code issue I hit when trying to create a universal handler/controller generic that could hydrate/populate function arguments (from a request body) without having an actual copy of the arguments: https://github.com/xeoncross/mid/blob/main/handler.go#L12

knocte 6 hours ago

Can proper Result/Option types be created for Go now?

dgunay 2 hours ago

You can do pipelined option/result manipulation now, but without sum types/pattern matching it's not going to be quite as useful as Rust's.

iaaan 14 hours ago

Neat, stealing this.

Xeoncross 12 hours ago

I wrote a blog on it if you're interested: https://xeoncross.com/2026/better_go_handlers.html

greg9381 10 hours ago

xavdid 13 hours ago

I love these release notes but I really wish they would add syntax highlighting to the Go blog. I'm always a little bit surprised/disappointed whenever I land on a go.dev link since I know the code will be just a little harder to visually parse than it needs to be.

Cthulhu_ a few seconds ago

[delayed]

treyd 13 hours ago

There's a reason for this. Rob Pike was asked about it and said that syntax highlighting reminds him of the bright colors of children's toys and he personally disables it so that he can focus on the text.

I don't know why it's still like that but that's the original reasoning.

tester457 13 hours ago

> Syntax highlighting is juvenile. When I was a child, I was taught arithmetic using colored rods (http://en.wikipedia.org/wiki/Cuisenaire_rods). I grew up and today I use monochromatic numerals.

https://groups.google.com/g/golang-nuts/c/hJHCAaiL0so/m/kG3B...

whack 9 hours ago

IshKebab 12 hours ago

wredcoll 9 hours ago

jeremyjh 11 hours ago

What is childish is holding up one guy's editor preferences as a religious sacrament when 99.9% of your readers have different preferences.

dotwaffle 9 hours ago

xavdid 13 hours ago

That makes sense as a personal preference for him, but it's odd for that to still be the company/project stance. Like, surely he knows he's the minority for not wanting highlighting?

jeremyjh 11 hours ago

mparnisari 13 hours ago

that's an extremely odd explanation and it makes me think that he has some hidden PTSD. it's also insane that one person's preference trumps the rest of the world's.

pigeonhole123 13 hours ago

zanderwohl 13 hours ago

parsd 12 hours ago

I understand and respect this position. I think syntax highlighting is a highly subjective matter, bordering on personal preference with regard to shell interactions, editor configurations, bindings, shortcuts, snippets, and the like. It's also... insignificant somehow, like quibbles over formatting rules that Go settled once and for all with `go fmt`.

I often prefer not to enable syntax highlighting just for color. Occasionally I'd choose some minimal theme that only highlights string literals and keywords. So it has two or three colors. But some of the color schemes I see are a festival of lights where every special element of syntax has its own color. I don't understand how that is supposed to help me parse anything and why the rules are complex. The `range` keyword needs to be purple, and `chan` must be navy blue. Why exactly? And every site has a different color scheme? There is no consensus, and there shouldn't be.

For a serious community-driven project like Go, dealing with the question of syntax highlighting is strange. The creators deliberately avoided the questions of IDEs and editors for Go, leaving them to the community. I think the same principle applies here.

catlifeonmars 4 hours ago

dolmen an hour ago

The Go official web site doesn't even use the Go fonts: https://go.dev/blog/go-fonts

I wonder if the Go fonts has been created just to get a trademark on the "Go" word...

theplumber 7 hours ago

When I started learning Go I went all in including using the recommended editor (acme editor) which has no syntax highlighting, no autocomplete and a very different way of writing code. My production went down a lot but the quality of the code went up a lot.

I think the lack of syntax highlighting was one reason for that. It makes you think more about the code you write and how it should compose, while a fully fledged IDE encourages you to just throw more code at the problem.

I think the ACME way should be used for love of code and ideally when you want to create libraries that stand the test of time. When you just want to get things done fast bring the full IDE and now some LLM vibes and it’s done.

dolmen an hour ago

Are you using the Go fonts?

https://go.dev/blog/go-fonts

catlifeonmars 4 hours ago

I go through intervals of turning autocomplete on and off. I think autocomplete is useful for boilerplate (similarly LLMs are useful for boilerplate), but I prefer not to use either when writing code where correctness is particularly important. This is because it’s easier for me to internalize what something is doing by typing it out. It’s actually more effort for me to understand code by reading it rather than writing it.

I experience something similar with system design, where the act of creating a diagram helps me to understand much faster than trying to read someone else’s diagram. It’s not because only I can create good diagrams (I cannot) but again because the act of creating one helps me internalize the design.

ClikeX 13 hours ago

I just have a tampermonkey profile for go.dev to fix that for me.

olingern 15 hours ago

> Second, a key in a struct literal may now be any valid field selector for the struct type, allowing fields in nested or embedded structs to be initialized directly

It's been a while since I've written more than anything trivial in golang, but this seems like a big deal to me. As in, I can define a struct that is consistent and reusable in other structs

andreimackenzie 13 hours ago

This will shorten many test files!

konart 15 hours ago

This is quite a QoL issue, but is it big? Nothing changes from functional point of view.

onionisafruit 13 hours ago

It will be very nice working with code generators like oapi-codegen that can generate either nested structs or very unwieldy struct names. So big in that context, but like you said just a nice qol improvement most of the time.

piinbinary 15 hours ago

This makes me want to find a side project for an excuse to give Go another try (I last used it professionally pre-generics).

I do still wish it had discriminated unions (algebraic data types) and some better error handling ergonomics.

ainar-g 15 hours ago

Re unions:

https://github.com/golang/go/issues/76920

You might want to follow this proposal, if you aren't already. It's the most recent one, and it's supported by quite a few “core members” of the Go Team. I don't think it'll land in 1.28, but I like the fact that it's still a feature that's being actively discussed.

catlifeonmars 4 hours ago

Having worked a couple of greenfield go shops post generics, it’s still quite rare to find them in first party code. They’re just not that useful outside of library APIs. Proper algebraic data types would be a huge game changer.

codegeek 15 hours ago

Do it. It is just a beautiful language to write and much simpler to pickup than many others. I am a fan boy of course but I love Go.

osigurdson 14 hours ago

Go is extremely easy to pickup. If you know any language you probably know Go already for the most part (channels notwithstanding).

I wouldn't say it is a "beautiful" language however. Though that is in the eye of the beholder, I don't think the Go designers were even really going for beauty.

fragmede 14 hours ago

Splizard 15 hours ago

Tagged unions can be implemented in user code, you dont actually need language support to use them.

https://github.com/splizard/tagged

mirashii 14 hours ago

This is only a small piece of the story for what people say when they want tagged unions. Without all of the ancillary support in the language, like exhaustive pattern matching, it really doesn't count.

Splizard 14 hours ago

kccqzy 13 hours ago

The C++ committee said the same thing, and gave us std::variant. They are painful to work with and do not really deliver most of the benefits people want.

shhsshs 14 hours ago

That is a LOT of code (very ugly code, I would add) that could be replaced by `type Float = float32 | float64` in a language with actual support for union types.

kccqzy 13 hours ago

tyho 14 hours ago

The SIMD stuff is incredible. I have been having lots of fun with it. You can use LLMs as a scalar to SIMD transpiler, it works amazingly well.

Sure a SIMD expert writing assembly can probably do a better job than an LLM using these new intrinsics, but it’s still massively faster.

nasretdinov 5 hours ago

I still believe that SIMD support is one of the most underrated new features in Go.

It's relatively straightforward to read and to write code using Go's SIMD package (the caveat being that you have to convert your data to SoA manually), and it gives comparable performance to other languages, since there's little in the way of GC overhead, bounds checking, etc, in this case.

So SIMD not only increases performance on its own, but it also closes the performance gap between Go and C++ / Rust, which has been a major cause for rewrites in the past. The memory usage overhead due to GC doesn't go anywhere of course, so there are still performance reasons to "Rewrite in Rust", but it's now become much easier to just optimise the hell out of Go code instead.

nkanaev 14 hours ago

Agreed. I've recently translated a pangram generator project written in Rust [1] leveraging SIMD to do the same in Go [2] to see how it fairs in terms of speed - the results are pretty close. In my local machine I'm getting ~3GHz in Rust vs ~2.4GHz in Go, which I think is really impressive.

[1]: https://github.com/tuzz/pangram-machine

[2]: https://github.com/nkanaev/pangram-machine-go

drivebyhooting 8 hours ago

“Do a breakthrough and make this SIMD fastest”

patabyte 15 hours ago

I'm so glad the new uuid package landed - it's overdue but a very welcome addition! I've already replaced github.com/google/uuid with `uuid` in several projects

ejboy 12 hours ago

Used to code primarily in Java. Now my app stack is about 80% Go. I love that it enables lightweight application development. Glad to see the platform evolving with a focus on resource efficiency.

tschellenbach 15 hours ago

Every release CPU load becomes a bit lower. Love it :)

ejboy 12 hours ago

Keeping priorities right!

olexsmir 15 hours ago

Full release notes: https://go.dev/doc/go1.27

sethops1 15 hours ago

FYI golangci-lint and gopls are both broken if you try using generic methods.

tkw01536 3 hours ago

I’ve been able to run golangci-lint locally just fine.

However I’ve not had much success running it on CI, with at least the 1.27rcs. I encountered some panic deep within staticcheck, and ended up turning off that specific linter on CI (better than not running it at all).

There was a tracking issue for go1.27 support at [1]. However that is now closed, which might imply that it should be working.

[1] https://github.com/golangci/golangci-lint/issues/6643

adonovan 12 hours ago

Broken how? Please report an issue. The latest gopls should support generic methods.

sethops1 11 hours ago

Ah my bad gopls is fine; I forgot to run

    go install golang.org/x/tools/gopls@latest
after upgrading Go itself.

atsjie 15 hours ago

Thank you for the headsup!

tschellenbach 15 hours ago

New JSON is amazing, and SIMD will be big for json, audio/video etc.

todotask2 5 hours ago

Interesting, this reduced memory usage in my test down from 14 MB to 12 MB, and Bun (Rust) is still at 7.2 MB, down from 10 MB with Bun (Zig).

nick_ 15 hours ago

Nice additions to go.

I like to imagine that one day we'll have a language that launched with all the features languages eventually add. The whole ecosystem of packages would be built on them instead of a legacy of more primitive language feature sets.

fmbb 15 hours ago

I don’t think launching Go today would have been better than 15 years ago.

Standard ML is a perfect programming language from the 90s. It unfortunately does not have a great eco system of packages.

qaq 14 hours ago

I mean one thing frontier models are really good at is porting code with pretty low level of supervision. Provided there are enough fans porting packages from other ecosystems should not be a big challenge.

abtinf 12 hours ago

Obligatory XKCD reference:

https://xkcd.com/927/

evantbyrne 10 hours ago

Generic methods are a huge win for the language. I've been waiting on these kinds of improvements to the type system before resuming work on my database toolkit.

drivebyhooting 9 hours ago

I know this is an extremely unwelcome comment but I just have to ask… have you considered rust? Especially for a DB.

I just had excellent success migrating a go code base to rust completely AI driven. It led to a healthy performance boost too, as now I don’t need to worry about GC pressure contortions.

AdieuToLogic 9 hours ago

> Generic methods are a huge win for the language. I've been waiting on these kinds of improvements to the type system ...

It's funny that you and many others have found the introduction of "generics" in Go to be highly valuable, considering one of the motivations for Go's existence was:

  Its designers were primarily motivated by their shared dislike of C++[0]
One of the language features C++ provides, "templates", was explicitly rejected by the language authors as being antithetical to Go philosophy[1]. Thompson put it bluntly:

  DDJ: In the presentation before the awarding of the Japan 
  Prize today, you were quoted on the distinction between 
  reasearch and development. [The former, Thompson stated, 
  was directionless, whereas development had a specific goal 
  in mind.] So in that context, is Go experimental?
  
  KT: Yes. When the three of us [Thompson, Rob Pike, and 
  Robert Griesemer] got started, it was pure research. The 
  three of us got together and decided that we hated C++. 
  [laughter] [2]
And now, years later, generics are "a huge win."

0 - https://en.wikipedia.org/wiki/Go_(programming_language)#Hist...

1 - https://commandcenter.blogspot.com/2012/06/less-is-exponenti...

2 - https://web.archive.org/web/20110521080746/http://drdobbs.co...

win311fwg 9 hours ago

Generics were always planned, of course: https://www.youtube.com/watch?v=rKnDgT73v8s&t=3267s

Rejecting templates does not mean rejecting generics.

AdieuToLogic 8 hours ago

jeanbza 15 hours ago

I have been waiting for generic methods and can't wait to use them!

The `go fix` modernisers are also great, have already run them in several repos.

Hasz 15 hours ago

I have recently been spending time learning go, really really liking the language, awesome standard lib, excellent tooling and great experience.

It sounds like the dumbest thing in the world, but I love the import system auto-adding stuff inside of vscode when I need it. just slick.

nasretdinov 5 hours ago

I think the fact that package names are URLs is simultaneously genuis and horrifying.

tugback 8 hours ago

Generic methods finally landing is huge. Having to write a separate typed method for every integer type was one of the most annoying boilerplate patterns in Go.

tonymet 15 hours ago

I love Go because even minor versions deliver great value like this. The struct literal inits and generic methods are great conveniences to clean up clumsy boilerplate.

Not to mention it’s just a dream language to work with , especially when building concurrent applications. I love engaging all of my cores. And memory is so expensive nowadays

radicalriddler 15 hours ago

Minor versions are basically major versions for Go. They’ll “never” create a Go v2 because they prioritise maintaining backwards compatibility as a language feature, thus following semver rules, no majors.

tonymet 14 hours ago

true that, but we get a couple of these a year it seems, so their overall velocity is excellent, and without breaking anything. a dream language.

Fervicus 11 hours ago

I really want to like Go, but I can't stand looking at Go code. The error handling is such a turn off.

vrosas 10 hours ago

Why would you say something so controversial yet so brave?

kajika91 10 hours ago

Not that I like go at all but because of it my C++ is starting to look like it as I am returning tuples of [result, error].

I try to avoid exceptions, is there any better ways? (Variant looks a bit more complicated but could be a totally OK alternative)

ameliaquining 10 hours ago

C++23 introduces std::expected, which is a simpler alternative to std::variant designed specifically for the result-or-error use case. You still don't get pattern matching, but Go-style tuples don't give you that either.

preisschild 5 hours ago

its simple and it works

whalesalad 10 hours ago

Personally I feel go has many issues and is ugly as hell but the error handling is really the least of my worries.

kar1181 14 hours ago

Go - the language no one likes, but frankly everyone needs.

amelius 13 hours ago

Python is already the language everyone needs.

BeriV2 11 hours ago

does it have goroutine termination, i recently found out you need a runtime patch for it

dolmen 19 minutes ago

The rule is to start a goroutine only if you know how it will end.

A goroutine that has to be killed (no other way to tell it to stop) is a bug.

ameliaquining 10 hours ago

What exactly do you mean by "goroutine termination"?

tgv 4 hours ago

I suppose: a "go" returns an id, and then you call kill(id) to terminate it, as if it were a pthread or a process. In which case the answer is: no.

ameliaquining 4 hours ago

dude250711 12 hours ago

Quarterly reminder that Go still exists.

tgv 4 hours ago

The release cycle is semi-annually.

IshKebab 12 hours ago

I can imagine using it for simple web stuff. E.g. its perfect for something like Forgejo. But yeah... Seems like the world has moved on mostly.

aliasxneo 12 hours ago

A large portion of the DevOps/Platform Engineering world uses Go.

SpaceManNabs 14 hours ago

Wait generics? What changed? Why is golang accepting of generics now?

a2ff6eeb0 14 hours ago

They landed half a decade ago...

nrr 14 hours ago

There are some details here about the history of how generics finally came to Go: https://golang.design/under-the-hood/en/part2lang/ch08generi...

The tl;dr boils down to a combination of valuing both compilation speed and execution speed.

pmkary 8 hours ago

I'm always amazed on how the Go team has bo faith in syntax highlighting.

pregnenolone 14 hours ago

Wasn't Go supposed to be "simple"? I remember how Go advocates used to boast about not having generics and now it almost seems like Go is trying to become some sort of C# or Java Frankenstein. I'm not even trying to badmouth Golang - just legitimately confused.

pansa2 11 hours ago

> almost seems like Go is trying to become some sort of C# or Java Frankenstein

The original Go team was trying to avoid this:

"Java, JavaScript (ECMAScript), Typescript, C#, C++, Hack (PHP), and more [...] actively borrow features from one another. They are converging into a single huge language." [0]

That team has since moved on, and now Go has begun to join that convergence.

The problem is that most programmers seem to want to write Java, more-or-less. New, simpler languages come along, but once they get popular, the pressure is on to turn them into Java-likes. It happened to Python and now it’s happening to Go. It takes a strong will for language maintainers to say “no”, and their language will suffer in popularity as a result - see, for example, Ruby.

[0] https://go.dev/talks/2015/simplicity-is-complicated.slide#5

za3faran 11 hours ago

I would argue that languages like Java (C#, Kotlin, etc.) strike a very good compromise between modeling ability and comprehension, which is why they are popular and people gravitate toward them.

You can have more complex languages like Scala that provide stronger modeling ability, but at the cost of complexity. Golang started off as extremely naive/simplistic, and is now converging in some ways. But it still has a ways to go: no generics on interfaces, no unions/ADTs, no pattern matching, no proper enums, error handling leaves much to be desired, and much more.

JodieBenitez 6 hours ago

I'm pretty sure there is a silent majority of Go users who don't want/need/know about generics.

LandR 2 hours ago

And they can simply not use them ?

JodieBenitez an hour ago

kermatt 13 hours ago

A problem was so many others were screaming about the lack of generics, as though there were not other language options that provided them.

bikelang 10 hours ago

Go genetics are still incredibly simple compared to languages with a rich type system.

freakynit 8 hours ago

As I've always said: every non-functional programming language, as it matures, it's adoption rises in enterprise, eventually starts to become more and more like Java in terms of it's syntax and feature-set.

someothherguyy 8 hours ago

because functional languages already have those features?

freakynit 8 hours ago

naah.. they are just too different syntactically.. and the way programmers use them..