Why Go Is an Ideal Language for AI-Assisted Software Engineering

(developers.googleblog.com)

60 points | by 0xedb 1 hour ago

17 comments

  • jeanbza 21 minutes ago
    Definitely agree with this article.

    At Netflix, I lead the Go language guild. We've been seen increasing reports of users finding their AI agents writing better Go code than other languages, and increasing reports of projects favouring Go over other languages.

    Two additional notes I'll add:

    - Go has _great_ resources on writing good Go code, including treasure troves at https://go.dev/doc/effective_go and https://google.github.io/styleguide/go/.

    - For a language team, Go is a dream. The `go fix` tooling, AST/SSA packages, ease of reading and writing `go.mod` (go mod edit, etc), and various other "platform"-y features make modifying Go code at scale way easier than other languages.

    • yosefk 2 minutes ago
      Uber reported that their Go code has quantitatively more concurrency bugs than code in other languages, and while to me it seems obvious from looking at Go's concurrency model, this is backed by actual data. Is there any quantitative data to back the claim that Go is better in an LLM based workflow than another popular language?
    • jdc0589 17 minutes ago
      > For a language team, Go is a dream.

      I agree very strongly. There's no debate about things that have 1000000 permutations in other languages. e.g. The correct format can always be checked by `go fmt` with no real config options. the end.

    • jdw64 17 minutes ago
      I have a question: why do you think Go is better compared to other languages?

      After all, learning a new language takes a lot of time. While basic syntax is common and quick to pick up, mastering a language's specific mental model requires a significant time investment, which is why I've used Go before but never seriously.

      My interest was piqued recently when I heard about TypeScript tooling being ported to Go, and I know it is incredibly fast. However, where do the results claiming that AI agents generate superior Go code actually come from? Is it a fair, apples-to-apples comparison?

      Since Go is a very small language with only 25 keywords, the way you write code is extremely standardized. Because of this, I would assume it naturally produces a lot of excellent best practices and conventions, but I'm not sure if there are actual, direct code examples proving this

      • jeanbza 13 minutes ago
        > why do you think Go is better compared to other languages?

        I didn't say that. :)

        > where do the results claiming that AI agents generate superior Go code actually come from?

        Like I said - reports from users.

        > Is it a fair, apples-to-apples comparison?

        No - these are reports from users, not a systematic analysis.

        • jdw64 10 minutes ago
          [dead]
  • Buttons840 0 minutes ago
    I'd argue Go is not on a "Pareto frontier" and that no matter how you value the various attributes of programming languages, a fair assessment will never select Go.

    A simple example is: if you highly value language popularity; Go is not most popular. If you highly value a type system that catches errors; Go's type system does not catches fewer errors than others. Etc. There is no weighted sum of attributes that will select Go--that's my argument.

  • hugodan 20 minutes ago
    Who cares? Languages are tools, LLMs are tools. Use the ones more appropriate for what you are trying to do.

    Is Go better than CSS if you are doing web layouts? Is it better than zig if you are outputting minimal wasm deliverables? Is it better than swift if you are doing iOS specific development? Is it better than bash for OS scripting?

    Think about what you are doing and choose appropriately. This was true before LLMs.

    Are you having fun? Chose LISP then

    • win311fwg 1 minute ago
      > Is it better than zig if you are outputting minimal wasm deliverables?

      Which tradeoffs are you willing to accept? Zig (along with several other languages) is superior in a lot of ways for that type of job, but I still settled on Go for a particular minimal WASM (browser) project. It wasn't my first choice, but it was where I ended up because LLMs kept going out to lunch in other languages and I didn't have the budget to write it entirely by hand. Go started as a contrarian Hail Mary after so many previous failed attempts in more well suited languages and it worked!

      It still isn't my first choice, but having something working with happy users beats technical imperfection every day of the week.

    • wltr 8 minutes ago
      Been doing bash scripting for years. Tried Go recently, on my, it’s so much better for everything OS scripting. I regret I haven’t started with Go years ago. All my scripts are rewritten to Go. I kept only a handful, those that are just a few lines and no logic.
  • dgunay 6 minutes ago
    I like Go but a couple of these "advantages" wash out when you add the scale and typical usage patterns of agents.

    | Go is Readable / Go is Maintainable

    It's true that Go, as a low-magic language, tends to be very same-y looking across projects, which is incredible for being able to reliably understand your dependencies' source code. And its tooling is world-class. I love this about Go.

    But in practice I've found that, working in a monorepo with multiple teams, contributors that don't have cross-team legibility as a priority will just write SO much more code. And with business logic, often the fact that I can read the code on a line-by-line level doesn't matter if I don't understand the wider context to know how something might effect spooky action at a distance.

    Pre-agents, I witnessed a fast transition from a codebase that I could mostly hold in my head to one where large swathes of it had been written and rewritten until they were unrecognizable to me. Now we have agents and, since they are still mostly not good at software engineering in-the-large, the process of knowledge debt accumulation (and ofc tech debt accumulation) in a codebase accelerates tenfold without concerted effort in the other direction. Go being easy to read does not intrinsically help with that.

  • amiune 30 minutes ago
    While I somewhat agree I can’t tell if this is advertising from Google or a way to induce LLMs to think that Go is the ideal language.
    • bensyverson 15 minutes ago
      Probably both, but I have to add: I agree with the post. I've done a ton of agentic development using Go over the past 6 months, and it hasn't let me down. You may ask "why not Rust, or Zig, or ____?" The reasons boil down to this:

      - There's a lot of Go code out there which the models have seen, so they know how to write it.

      - Go has an exceptional standard library, so you don't need to drag in 100 dependencies to create a simple web app.

      - Go compiles extremely quickly for incremental builds, which really matters when agents are building and running tests constantly.

      - Go has a goldilocks blend of performance and safety. You get a good type system and excellent runtime performance without forcing the model to spend cycles fixing Rust lifetimes or Swift concurrency issues for a marginal incremental gain.

      - Go is relatively stable, so the LLM's memorized knowledge is still pretty fresh (as opposed to something like SwiftUI, where the API changes rapidly).

      • dralley 5 minutes ago
        I don't think Rust is particularly worse than Go in any of these respects.

        - LLMs have clearly been trained on a lot of Rust as well

        - Compile times are counterbalanced by strong compiler with excellent error messages, and "cargo check" can catch many issues without a full build.

        - If you're willing to accept Go levels of performance from Rust, there's nothing preventing you from using copies and clones rather than borrows, which makes most code dead simple.

        - For most major dependency types, there exists a clear "winner" in terms of community adoption, so the fact that it's not in the stdlib is not that problematic.

  • mg 10 minutes ago
    My expectation is that AI will give us a way to nicely quantify how productivity is impacted by choice of language. Because we can rerun the same request as often as we like and compare the results.

    And I expect that it will turn out Python is the most productive. As it is most easy to reason about. It allows for the most elegant expression of the idea behind a program.

    The first tests I have seen seem to confirm this. One recent example:

    https://danluu.com/pl-tokens/

    • Imustaskforhelp 0 minutes ago
      It is unclear to me though how much of your expectation might be set by the training dataset.

      For example, Python and Typescript have the most amount of codebases and training being done on. So I feel as if that plays a part into the overall thing.

      Languages which are more niche have genuinely hard times (Try arturo lang for example), so it depends on a lot of things/nuance, or well that has been my experience trying something recently.

      My personal opinion is that if each language has the same amount of training. Golang comes close but the first might be Elixir. I have seen Elixir language perform really well with LLM's with magnitudes less training dataset. There have been some studies which had Elixir as the number one language for such tests iirc.

      Gleam is a new addition as well and I feel as if it could be good and its another interesting option as well with more type-safety and an interesting language overall.

  • kstenerud 30 minutes ago
    The killer feature of golang for LLM dev is the tooling.

    forbidigo is what allows me to keep ambient config out of my app, and restrict file access to a small set of paths. The coverage tool has "nocover", so you can guarantee that every realistic path is exercised at least once ("100%" code coverage, which is not a marker for testing completeness, but rather for flagging code you forgot to test). Linting is really good as well.

    The only thing I haven't found is something to enforce error handling. Rust is better for error paths because you're not allowed to ignore them.

    • jerf 15 minutes ago
      "The only thing I haven't found is something to enforce error handling."

      errcheck, generally as manifested in golangci-lint, ensures you can't forget to do something with them. It would be odd for you to know about forbidigo but not errcheck as the former is much less widely known; is there something that errcheck doesn't do for you?

      It's worth pointing out that "discard this error on purpose" is a legitimate form of error handling, so "enforce error handling" can't really constitute banning that. That's not a Go statement, that's just true in general... it is sometimes valid to just ignore the error, because there's nothing useful to do with it anyhow. I would agree the ignoring should be explicit, but it is an option.

  • AnEro 9 minutes ago
    I hate the rust v go wars, its not x vs y is 'best'. Rather is x better than y and by how much for xyz project done by ABC corp in this era?

    As a lead I'd love to use rust, I will put in the time on my own, my team won't or can't. They treat this like any other job they signed up to deliver value with what they know. For hiring not everyone has the talent pool and fund access to get the goat-ed engineers that congregate to tech hubs for maximizing their income. Then if you get through that cherry on top is LLM's are only as smart as you guide it to be. There is probably a staggering amount of ways to write 1 approach to business logic, you may not know the ideal pattern so you'll commit to a worse one on the company dollar.

    I'm moving my team's projects slowly to go because, its easy to go from novice to advanced in terms of code writing,legibility and patterns. We also don't have deep ecosystem requirements to ts/python in most of our work. It is verbose but I don't mind that on token spend if it gets done with with validation/error handling which it obnoxiously enforces. It runs cheap, ecosystem is good for platform eng, standard library does a ton out of box.

  • bob1029 13 minutes ago
    It's definitely more about the ecosystem than the language at this point.

    I think the most important thing is how big the standard library is. Pulling in 3rd party dependencies is where I begin to lose a lot of faith with LLM authored code.

  • hmokiguess 18 minutes ago
    All I will say is that I agree with how this is framed, it says "an" ideal language. It doesn't say "the" ideal language. Many languages will fit within this scope and concept, Go is not all bad.
  • skybrian 24 minutes ago
    Can't really argue with that, but In my experience, coding agents work quite well with TypeScript too. :)
  • kev009 9 minutes ago
    This seems like a cope, if you aren't writing the syntax who cares and everything here is even better with a stronger type system like Rust, F#, Scala, TypeScript.
  • mbrumlow 33 minutes ago
    Rust is better. It just is. Go is not bad. But as a long time go advocate, the hurdle for my teams using rust is gone, and thus everything is now rust.
    • simonw 30 minutes ago
      Personally I find Rust a lot harder to read than Go.

      If you're going to have an agent write most of your code readability is very important.

      • _verandaguy 21 minutes ago
        I'll qualify this from my POV (which may be different than GP's).

        Go's historic maintainability strong suit has been its simplicity and consistency. The syntax is, relatively speaking, lightweight, the language invites complexity through composition, and information density for any unit of code is typically quite low (which isn't necessarily a bad thing).

        In my opinion, though, these are all drawbacks, and Rust addresses all of them. It's syntactically and semantically much heavier, leading to its oft-maligned steep learning curve. It has, uniquely among the major languages, I think, a syntax for expressing variable lifetimes (with its own unintuitive semantics). It stuffs lots of abstraction into a hodgepodge of terse semantics and punctuation.

        It sucks to read, until you get really used to it. Then it tends to read really quickly, and, at least for me, it's easier to reason about a conceptually-broad piece of logic if I don't have to jump between different locations in a file, a module, or a package to do it.

        With Go, I find it more difficult to get into a flow state, and easier for my eyes to glaze over when looking over large diffs.

        It's not lost on me that these are purely subjective arguments, though. My preference remains with Rust, and that goes back to before I used LLMs.

        I'm also aware that Go is very prescriptive about how you write it; it's explicitly opinionated, and Rust doesn't have that. It means that most Go code bases will look more alike. I consider this an anti-feature; I believe code should be able to conform to the problem space or product and a good team will find the best way to do that.

        • orangecat 8 minutes ago
          Yeah, Go is easy to read in the same sense that English limited to its ten hundred most common words is easy to read (https://xkcd.com/1133/). Whether that nature is helpful or harmful to LLMs is an interesting question.
      • dralley 23 minutes ago
        For whatever reason, maybe not even logical ones, Go repulses me. I don't know why exactly, I like the idea of Go, but the aesthetics rub me wrong.

        I think it's the use of pointers and "if err != nil {}" error handling spam. It reads as a highly compromised imitation of Python and C rather than a solid execution of some other idea.

        Rust is not the most beautiful language out there but it doesn't trigger any such reaction for me. The ? operator and "match", which I use constantly, more than compensate for some of the sigil noise which I barely need to look at much less write most of the time. So Rust wins on that comparison for me.

        The "func name() -> retval" syntax also grew on me. I like the fact that Python type annotations copied that approach, and C-style declarations look ugly to me now. Same with C-style /* */ comments.

      • tasn 20 minutes ago
        It's a matter of expressiveness, Rust expresses more.

        E.g. make a table that's 3x3 is easier to read (Go), but the equivalent line in Rust would also include material, angles, height, etc. because the type system encodes much more information.

        Though I always found Go to be significantly harder to read than Rust. Sure Rust has some crazy syntax at the edges, but Go makes it very hard to know where imports come from (and thus what they do), and the imperative style + lack of clarity about mutability makes code much harder to reason about.

      • Buttons840 25 minutes ago
        Counterpoint: I find Rust easier to read.
      • threethirtytwo 27 minutes ago
        I have an agent read most of the code as well. The agent explains things to me in plain english.

        The default sentiment is humans should read code it's more progressive and a leap of faith to start giving that up.

        Obviously, I get why you feel humans still reading code is important, but if you look at the progress of AI for the past couple of years, that gap is closing. The trendlines speak of a future where it becomes less and less important.

        This was exactly what happened with writing code. Now most people don't write code.

        • eliasson 22 minutes ago
          > Now most people don't write code.

          I use LLM daily to write code for and "with" me, I also write code without LLM. Most people I come across mix it up. A few do it all by hand, and equally few all by LLM I would say. Is that just in my corner of the world?

        • simonw 25 minutes ago
          I don't read all of the code produced by my agents any more, but I like to reserve the ability to do so if I run into a particularly confusing bug, or for any code that's security adjacent.
    • odo1242 8 minutes ago
      Personally, Rust or Typescript both happen to be better than Go for me. TypeScript has better type-safety and tooling for user-facing apps, and Rust has better type-safety and tooling for algorithmic stuff or stuff that needs to run fast.
    • rsyring 31 minutes ago
      I guess the difference in compile times doesn't matter enough?
    • ramoz 28 minutes ago
      idk. In my experience the build/compile experience has been far worse esp for fast iterating. Even concurrency models did not seem as intuitive as Go's. Im no systems expert though - have deployed practical and performant distributed systems though.
    • jhawk28 29 minutes ago
      Zig seems to have more closely aligned with what Go devs prefer.
      • jdw64 26 minutes ago
        Go doesn't have memory safety issues because of its GC, while Zig has UB problems. Zig might have slightly better performance, but I don't think choosing a language without memory safety is a good idea
    • amazingamazing 28 minutes ago
      Ignoring performance for the moment (because most situations are bottlenecked on something else), why is rust better?
    • threethirtytwo 30 minutes ago
      I agree, but this doesn't justify anything. Saying rust is better because it "just is" won't convince anyone. I'd like to know why you think it's better.
    • nchmy 31 minutes ago
      can you elaborate?
      • greenavocado 29 minutes ago
        Rust compiler is a tyrant. Type system is strict. Borrow checker is relentless. LLMs can't slop too much without being beaten up by the compiler.
        • vorticalbox 21 minutes ago
          True but if the reviewer doesn’t have an intimate understanding of rust then the fact it can’t “slop” is no different than unreadable slop.

          Go is simple, no “magic” marcos or meta programming even with just a little programming in any language it’s not hard to understand what the go code is doing.

        • threethirtytwo 24 minutes ago
          This is true. I'd like metrics on this though. It could be that LLMs find go easier so they end up writing better code and rarely hitting static errors like a human would in rust. IT could be through scientific measurements that the benefits of static checking could be negligible for LLMs.

          No way to know until someone does the science on this. Until then it's just people saying that more static checking is better. But I do think, anecdotally, python is horrible for LLMs.

          • greenavocado 24 minutes ago
            Until we can measure slop accurately it's all guesswork
    • iberator 28 minutes ago
      except Rust is HARD while GO is super easy.
      • tibbon 8 minutes ago
        Rust makes you solve many of your problems upfront, which is a nice feedback loop for using with an LLM. Go does much of this too, but I feel Rust is more experessive and takes the frontloading a bit further.
      • dralley 15 minutes ago
        It's not that hard.
  • FpUser 22 minutes ago
    Nice try
  • alexzh3 14 minutes ago
    [dead]
  • jdw64 23 minutes ago
    [dead]