HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
golang
go
Go2014–2026
golang / go

go

The Go programming language

1,181Distinct people
1,944Mentions
14Explicit recommenders
139.9KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

The Go programming language

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

> To convert the Stream.Reader to an std.Io.Reader, we need to call its interface() method. To get a std.io.Writer from an Stream.Writer, we need the address of its &interface…

j1elo used a recommendation phrase. 14 indexed comments match. This is a phrase match, not a verdict.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

Mentioned in the same Hacker News threads. That is not proof they are substitutes.

This week on Hacker News

Nov 8–Nov 15 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/15/2026, 10:02:05 AM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year1,944 dated mentions

Observed mentions: 2014-12-08 08:41:45 UTC to 2026-10-22 10:17:39 UTC.

0501001502002014-01-01 00:00:00 UTC to 2015-01-01 00:00:00 UTC (exclusive): 16 mentions; 1 submissions, 15 comments20142015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 80 mentions; 17 submissions, 63 comments2016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 135 mentions; 18 submissions, 117 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 164 mentions; 20 submissions, 144 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 174 mentions; 26 submissions, 148 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 196 mentions; 30 submissions, 166 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 159 mentions; 21 submissions, 138 comments20202021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 184 mentions; 34 submissions, 150 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 220 mentions; 45 submissions, 175 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 221 mentions; 27 submissions, 194 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 163 mentions; 13 submissions, 150 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 167 mentions; 24 submissions, 143 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 65 mentions; 15 submissions, 50 comments. Incomplete calendar period.2026*

* An incomplete calendar period is marked with an outlined bar. Its count is not directly comparable with a full period.

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20142014-01-01 00:00:00 UTC2015-01-01 00:00:00 UTC16115
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC801763
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC13518117
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC16420144
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC17426148
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC19630166
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC15921138
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC18434150
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC22045175
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC22127194
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC16313150
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC16724143
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC651550

From the project README

An excerpt from the repository, fetched Nov 12, 2026.

Read the project’s introduction
The Go Programming Language Go is an open source programming language that makes it easy to build simple, reliable, and efficient software. Gopher image by Renee French, licensed under Creative Commons 4.0 Attribution license. Our canonical Git repository is located at https://go.googlesource.com/go. There is a mirror of the repository at https://github.com/golang/go. Unless otherwise noted, the Go source files are distributed under the BSD-style license found in the LICENSE file. Download and Install Binary Distributions Official binary distributions are available at https://go.dev/dl/. After downloading a binary release, visit https://go.dev/doc/install for installation instructions. Install From Source If a binary distribution is not available for your combination of operating system and architecture, visit https://go.dev/doc/install/source for source installation instructions. Contributing Go is the work of thousands of contributors. We appreciate your help! To contribute, please read the contribution guidelines at https://go.dev/doc/contribute. Note that the Go project uses the issue tracker for bug reports and proposals only. See https://go.dev/wiki/Questions for a list of places to ask questions about the Go language.
Read the full README on GitHub

What Hacker News says

135 sources
In my experience working with new and experienced Go developers that simplicity is pretty superficial. Take a look at SliceTricks[0]. These are all pretty simple operations in other languages that the Go authors think users should be forced to write manually so they understand the costs. Reading these in code reviews is definitely not a breath of fresh air. I also see Go users develop bad habits that will burn them in other languages, like returning a reference to a "stack" allocated variable. In the same vein, if you care about performance you have to internalize the escape analysis rules, which most new users won't know about. There are tons of footguns[1] in Golang as well. I constantly see people get burned by issues at runtime. I truly believe that the Golang benefits are short-sighted. You get some upfront development gains that you
Read the rest
end up pain for with less reliable software. I personally would rather pain that cost upfront where possible with the compiler telling me when something is wrong. [0] https://github.com/golang/go/wiki/SliceTricks [1] http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in...
In Rust is mostly safety
> The point is that I wrote naive approach in both languages and it's a lot faster in Go. I tried your challenge, and the first data point I uncovered contradicts this. Here is the source code of both programs: https://gist.github.com/anonymous/f01fc324ba8cccd690551caa43... --- The Rust program doesn't use unsafe, doesn't explicitly use C code, is shorter than the Go program, faster in terms of CPU time and uses less memory. I ran the following: $ /usr/bin/time -v ./lossolo-go /tmp/OpenSubtitles2016.raw.sample.en the $ /usr/bin/time -v ./target/release/lossolo-rust /tmp/OpenSubtitles2016.raw.sample.en the Both runs report 6,123,710 matching lines (out of 32,722,372 total lines). The corpus is ~1GB and can be downloaded here (266 MB compressed): http://burntsushi.net/stuff/OpenSubtitles2016.raw.sample.en.... --- My /tmp is a ramdi
Read the rest
sk, so the file is in cache and I'm therefore not benchmarking disk reads. My CPU is an Intel i7-6900K. The Go program takes ~6.5 seconds and has a maximum heap usage of 7.7 MB. The Rust program takes ~4.2 seconds and has a maximum heap usage of 6 MB. (As measured by GNU time using `time -v`.) --- IMO, both programs reflect "naive" solutions. The point of me doing this exercise is to show just how silly this is, because now we're going to optimize these programs, but we'll limit ourselves to smallish perturbations in order to put a reasonable bound on the task. If I run the Go program through `perf record`, the top hotspot is runtime.mallocgc. Now, I happen to know from experience that Scanner.Text is going to allocate a new string while Scanner.Bytes will not. I also happen to know that the Go standard library `bytes` package recently got a nice optimization that makes bytes.Contains as fast as strings.Contains: https://github.com/golang/go/commit/44f1854c9dc82d8dba415ef1... --- Since reading into a Go `string` doesn't actually do any UTF-8 validation, we don't lose anything by switching to using raw bytes. Knowing this, we can tweak the Go program to great effect: https://gist.github.com/anonymous/c98dc8f6be6d414ae3e7aa6931... --- Running the same command as above, we now get a time of ~2.3 seconds and a maximum heap usage of 1.6 MB. That's impressive. Now let's see if we can tweak Rust, which is now twice as slow as the Go program. Running perf, it looks like there's an even split between allocation, searching and UTF-8 validation, with a bit more towards searching. Like the Go program, let's attack allocation. In this case, I happen to know that the `lines` method returns an iterator that yields `String` values, which implies that it's allocating a fresh `String` for every line, just like our Go program was. Can we get rid of that? The BufReader API provides a `read_line` method, which permits the caller to control the `String` allocation. If we use that, our Rust program is tweaked to this: https://gist.github.com/anonymous/a6cf1aa51bf8e26e9dda4c50b0... --- It's not quite as symmetrical as a change as we made to the Go program, but it's pretty straight-forward IMO. Running the same command as above, we now get a time of ~3.3 seconds and a maximum heap usage of 6 MB. OK, so we're still slower than the Go program. Looking at the profile again, the time now seems split completely between searching and UTF-8 validation. The allocation doesn't show up at all any more. Is this where you got stuck? The next step from here isn't straight-forward because getting rid of the UTF-8 validation isn't possible to do safely while still using the String/&str search APIs. Notably, Rust's standard library doesn't provide a way to search an `&[u8]` directly using optimized substring search routines. Even if you knew your input was valid UTF-8 before hand, there's no obvious place to insert an unsafe `from_utf8_unchecked` because the BufReader itself is in control of producing the string contents. (You could do this by switching to using `BufReader.read_until` and then transmuting the result into an &str, but that would require unsafe.) Let's take a leap. Rust's regex library has a little known feature that it can actually search the contents of an &[u8]. Rust's regex library isn't part of the standard library, but it is maintained as an official crate by the Rust project. If you know all of this, then it's possible to tweak the Rust program just a bit more to regain the speed lost by UTF-8 checking: https://gist.github.com/anonymous/bfa42d4f86e03695f3c880aace... --- Running the same command as above once again, we now get a time of ~2.1 seconds and a maximum heap usage of 6.5 MB. In sum, we've beaten Go in CPU time, but lost the Battle for Memory and the battle for obviousness. Beating Go required noticing the `read_until` API of BufReader and knowing that 1) Rust's regexes are fast and 2) they can search &[u8] directly. It's not entirely unreasonable, but to be fair, I've done this without explicitly using any unsafe or any C code. None of this process was rocket science. Both the Go and Rust programs were initially significantly sub-optimal because of allocation, but after some light profiling, it was possible to speed up both programs quite a bit. --- Compared to the naive solution, some of our search tools can be a lot faster. Performing the same query on the same corpus: ripgrep 1.13 seconds, 7.7 MB ripgrep 1.35 seconds, mmap GNU grep 1.73 seconds, 2.3 MB ag 1.80 seconds, mmap pt 6.41 seconds, mmap sift 50.21 seconds, 16.6 MB The differences between real search tools and our naive solution actually aren't that big here. The reason why is because of your initial requirement that the query match lots of lines. Lots of matches results in a lot of overhead. If we change the query to a more common type of search that produces very few matches (e.g., `Sherlock Holmes`), then our best naive programs drop down to about ~1.4 seconds, but ripgrep drops to about 200 milliseconds. From here, the next step would be stop parsing lines and start searching the entire buffer directly. (I hope to make even this task very easy by moving some of the searching code inside of ripgrep to an easy to use library.) --- In sum, your litmus test essentially comes down to these trade offs: - Rust provides a rich API for its String/&str types, which are guaranteed to be valid UTF-8. - Rust lacks a rich substring search API in the standard library for Vec<u8>/&[u8] types. Because of this, efficient substring search using only the standard library has an unavoidable UTF-8 validation cost in safe code. - Go doesn't do any kind of UTF-8 checking and provides mirrored substring search APIs between its `bytes` and `strings` packages. - The actual performance of searching in both programs probably boils down to optimized SIMD algorithms. Therefore, once you get past the ability to search each line of a file with minimal allocation, you've basically hit a wall that's probably the same in most mainstream languages. In my opinion, these trade offs strike me as something terribly specific, and it's probably not something that is usefully generalizable. More than that, in the naive case, Rust is doing you a good service by checking that your input is valid UTF-8, which is something that Go doesn't do. I think this could go either way, but I think it's uncontroversial that guaranteeing valid UTF-8 up front like this probably eliminates a few possibly subtle bugs. (I will say that my experience with text encoding in Go has been stellar though.) Most importantly, both languages at least have a path to writing a very fast program, which is often what most folks end up caring about at the end of the day.
In Rust vs C Pitfalls
Thanks! It shouldn't be hard, and I've played with the Go AST before. I ... could :) This was sort of a bucket list thing though, doing it a second time is less fun :p And I don't have that much time. Why don't you try? The technique explained in the blog post is pretty universal. Go has an AST too, and while the Folder abstraction doesn't exist in its codebase (as far as I know), you can still tweak the AST. In the case of Go it would be easier to do the injection during parsing. https://github.com/golang/go/blob/5c9035acc1e1540a564ea66000... would be a good entry point. https://golang.org/pkg/go/ast/ should help. (I am not a Go compiler dev so there may be better entry points)
In Reflections on Rusting Trust
I'm not a Go user myself, and my comment is about programming in general rather than Go specifically (though Go seems to be leading the way in this area). Does alias help Go programs automatically transform themselves? Alias seems to provide direct compatibility between types, but doesn't seem to provide any way to automatically refactor code based on the alias, does it? https://github.com/golang/go/issues/16339 Basically what I'm thinking is something like an alias feature where when A has been renamed to B, such that the name A has been left for backwards compatibility as an alias to B, then an automation layer could also help by automatically offering to rename A to B in existing code.
In Codebase Refactoring with Go
Interesting insights! I would love to hear more in how you exactly you bridged ObjC <-> Go. Do you mean you just ship a compiled Go binary as part of your app and interact with that? If yes, did apple not say anything about it during review? I saw that you can call Go in mobile apps [0]. I'm wondering if that's also applicable for desktop apps [0]: https://github.com/golang/go/wiki/Mobile
In Show HN: Primitive for macOS
> Many of the "old" ways of thinking do not apply to Go Whatever. Just because the language is effectively broken doesn't make practices in other languages irrelevant. And it's funny when you talk about the "old" ways of thinking in language that basically promotes C styles errors and bad macros through go gen. When I say the language is broken, look at Go type system, then look at how Go reflection makes the language look a dynamically typed one. It would have been smarter to tone down the reflection and make it unnecessary with a smarter type system. If it is there then it is because it was necessary for Go designers. If it had not been, then Go would not need that insane reflection. Now Go back to your Go code and remember all tricks you need to learn when working with arrays : https://github.com/golang/go/wiki/SliceTricks Just because
Read the rest
: > A weakness of Go is that any generic-type operations must be provided by the run-time https://blog.golang.org/slices Now what was your point about the "old" ways of thinking again ?
In Seven years of Go

Showing the 15 most recent of 135 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.