[HN Gopher] Ask HN: Which are the best Go repositories to read t...
___________________________________________________________________
Ask HN: Which are the best Go repositories to read to learn the
language?
I am looking for examples of open source projects showcasing best
in class use of Golang. It doesn't need to be the famous products
we all know about. I am looking at examples of real world
professional usage for somebody already familiar with the language
constructs and syntax.
Author : Kreotiko
Score : 139 points
Date : 2021-01-17 16:26 UTC (6 hours ago)
| pa7ch wrote:
| I really enjoyed reading the upspin codebase. I thought it was
| really a clean design and clean code. Some of the early go team
| members were working on it including andrew gerrand and rob pike.
| I think its a bit of an experiment on how one might design a
| content sharing system if you were to start from the ground up
| and not on the current web standards. I particularly like how
| they work authentication and authorization into the model. I had
| a few experimental upspin services I wanted to write but never
| got around to.
|
| Another great read for learning go that covers the more
| traditional challenges of standing up a basic web service with
| user accounts, testing, metrics, etc. is
| https://github.com/benbjohnson/wtf and the accompanying blog
| posts that cover how to structure such an application and why.
| mbyio wrote:
| A lot of people are saying to read the stdlib, but the stdlib has
| a lot of objectively bad code in it. Some of it is necessary due
| to the nature of a standard library - you have extra concerns
| about dependencies to ensure people don't have to include the
| entire stdlib in every binary. Some of it is stuff they hacked
| together when they were still designing the language, and that
| initial code still works fine so no need to update it.
|
| I think the source code for pkg.go.dev is actually a treasure
| trove of good ideas and design patterns, especially if you are
| trying to make a small to mdedium sized web app (which, lets be
| real, is almost all web apps anyone will ever make).
| https://github.com/golang/pkgsite
| ValentineC wrote:
| I consider rclone one of my most used tools for managing data,
| and personally think it's reasonably well-structured:
| https://github.com/rclone/rclone
|
| I agree with the other commenters that stdlib is excellent for
| delving deep into the language.
| tyingq wrote:
| I think LXD would be a good repo to look at. You would see
| examples of REST daemons, clustering, database access, auth,
| containers, etc. https://github.com/lxc/lxd
| marvinblum wrote:
| You can check out the Pirsch Analytics core [0]. I'm the
| maintainer and can answer all your questions :) It probably
| contains most features you'll use when programming in Go. Take a
| look at the tracker.go for a concurrent collector. It also has a
| lot of parsing, a data model, database, http, public API, ... and
| UI is not required while learning Go I suppose.
|
| [0] https://github.com/pirsch-analytics/pirsch
| jszymborski wrote:
| It's no substitute for reading the code for a useful bit of
| software, but I always like to head over to
| https://learnxinyminutes.com/ to check out the short code
| examples/overviews to get a feel for a language.
| BlueGh0st wrote:
| Their COBOL in 30 minutes was a nice before bed read that put
| me well informed enough to have a discussion with my mom about
| the details of her career and looking over notes from her work
| with the language.
|
| I've been intending to look up Golang on the site but I forgot
| until now. Thanks!
| bilinguliar wrote:
| I also suggest reading: stdlib, projects by Rob Pike (Upspin),
| Andrew Gerrand, Brad Fitzpatrick, Dmitry Vyukov, Jaana Dogan,
| Jonathan Amsterdam.
|
| Please avoid: Kubernetes, AWS code.
|
| As a rule of thumb - less imports is better.
| m1 wrote:
| Just out of interest, why avoid Kubernetes?
| theshrike79 wrote:
| Kubernetes started with a really early version of Go and had
| to create from scratch a bunch of stuff that's in the stdlib
| nowadays.
|
| Basically they've reinvented the wheel a bunch of times and
| now it's too late to import stdlib.Wheel =)
| nvarsj wrote:
| Actually, k8s was written in Java originally. Then
| basically verbatim copied to golang. That's why you have
| this ObjectMeta stuff - it was trying to implement an OO
| system in golang. Lots of weirdness can be traced back to
| the Java origin.
| bilinguliar wrote:
| Do not get me wrong, k8s is a revolutionary piece of
| software, but it is not the best example of a clean Go
| project.
|
| There are a few disturbing things:
|
| 1) Usage of `utils` package. Points against it were made in:
|
| https://dave.cheney.net/2019/01/08/avoid-package-names-
| like-...
|
| https://github.com/golang/go/wiki/CodeReviewComments#package.
| ..
|
| 2) Check out the number of dependencies. This looks almost
| like NPM hell.
|
| 3) Lack of standardization and consistency. This project is
| so big, and there are so many contributors with their coding
| styles that the project looks untidy.
|
| 4) A lot of import renaming is a symptom of package name
| clashing or simply poor package naming. You usually do not
| need to rename import, and this is simply not required if
| your package structure was carefully thought about.
|
| Again, k8s is great. K8s solves a lot of problems. I love it,
| but it is not a great example of Go code.
| deepanchor wrote:
| I learned a lot from reading the Perkeep [1] codebase (formerly
| Calimstore). One of its core developers is Brad Fitzpatrick
| (former Golang team member) so you can be fairly confident it's
| idiomatic Go.
|
| [1] https://github.com/perkeep/perkeep
| sneak wrote:
| I started trying to implement a basic example best practices (yet
| full featured, as a starting point for my own projects) go http
| server.
|
| This is my result:
|
| https://git.eeqj.de/sneak/gohttpserver
| inancgumus wrote:
| Not a project per-se but a lot of small example projects:
| https://github.com/inancgumus
| 37ef_ced3 wrote:
| Read the Go standard library, especially the parts written by
| Russ Cox. The parts written by Griesemer are less pleasant, no
| offense to him
|
| But some of Go's language decisions only become clear once you've
| written a lot of Go
|
| For example, the "var name = expr" declaration form seems
| unnecessary in light of the short ":=" form but it is in the
| language to allow indented declaration blocks like this (where
| some variables get an initial value and some get just a type):
| var ( text []byte last int more =
| true ) ...
|
| I've been using Go for 3 years and the more Go I write, the more
| I appreciate it. Enjoy
| vegancap wrote:
| I second Russ Cox's contributions to the stdlib. I recently
| went to check which version of Go the embedded API was added,
| and noticed a PR by Russ, I glanced through it and saw some
| really impressive and thoughtful code. I've made a point since
| to go back and look through more!
| JohnCClarke wrote:
| The easiest way to learn golang is to sign up on HackerRank and
| try out their exercises. You can do it in-browser, so no need to
| even install the toolchain. You'll learn faster by doing and
| reading in parallel.
|
| To see examples of good source code just click thru the function
| names when searching the documentation. E.g.
| https://golang.org/pkg/net/http/#NewRequest They link directly to
| the source code, and the standard library is extremely well
| commented.
| nemo1618 wrote:
| The best Go source code is the stdlib. When you read stdlib code,
| you can be confident that nothing is there by accident. Every
| decision was made for a reason. When you're learning, that's
| invaluable, because it means you can "dig" anywhere and be
| rewarded for it, whereas "digging" into most codebases will often
| be a waste of time.
|
| Also, I would advise actively _avoiding_ the big names you have
| heard of. A lot of products are successful despite having garbage
| code. And even more of them are successful despite having only
| decent code, full of stuff not worth emulating.
|
| Try to identify people who have a lot of experience and a strong
| command of the language, then look at their most recent projects.
| matwood wrote:
| > The best Go source code is the stdlib.
|
| As a golang beginner, the go stdlib is one the most readable
| stdlibs I've read through. The combination of gofmt, manageable
| language features, and idiomatic ways to do things make _most_
| go code fairly easy to read.
|
| I know go doesn't have a million language features, but
| readability after the fact is one of the benefits of this
| approach.
| sagichmal wrote:
| The stdlib is kind of a mess. One kitchen, many cooks, and
| everyone was learning how to put a five-course meal together as
| they went. There are some great bits -- package io and ioutil,
| for example -- but a lot of it is full of what we now
| understand are bad ideas, and the compatibility promise
| prevents anyone from doing anything about it.
|
| There is much better code to read. I second the recommendation
| of HashiCorp's stuff. Stay away from Docker and especially
| Kubernetes.
| earthboundkid wrote:
| FYI, ioutil is deprecated in Go 1.16. :-) They copied
| everything out of it and into io and os. It's much cleaner
| actually once you get used to it.
| geoah wrote:
| Couldn't agree more. Cheney's response to why that is was "do
| as we say, not as we do".
| wbl wrote:
| Do you have source / more details? There certainly are a
| few warts but overall it gets the job done.
| phoinix wrote:
| I second that. Stdlib is great to get a feel how the language
| works. Some small programs are always the best, if they are
| written by a good programmer. A cli game i study right now but
| in Rust. A small program with a lot of logic, but without all
| the graphics distractions.
|
| https://github.com/VladimirMarkelov/solkit
| tonymet wrote:
| It's also one of the more readable stdlibs. I use it for idioms
| and snippets .
| thinkingkong wrote:
| The stdlib is the best for clarity. But there are some
| excellent examples of how to structure projects depending on
| what you're trying to build. Mat Ryer gave an excellent talk on
| writing HTTP Services. If you want a good example on how to
| write distributed systems then Hashicorps' projects are more or
| less gorgeous.
|
| https://medium.com/@matryer/how-i-write-go-http-services-aft...
|
| https://github.com/hashicorp
| matwood wrote:
| To add to your point, Nic Jackson from hashicorp has a bunch
| of how-to videos and presentations that I've found good also.
|
| https://www.youtube.com/channel/UC2V1SxXFUa5YxVJvTsrCgyg
| bewuethr wrote:
| He also wrote a book:
| https://www.packtpub.com/product/building-microservices-
| with...
|
| The book might be good, but my copy had a problem with
| spurious characters in every code block, but that seems to
| be fixed in later printings.
| dastx wrote:
| Great resource! Thanks.
| nemo1618 wrote:
| > Hashicorps' projects are more or less gorgeous
|
| Is there a particular piece of code (as in, a single
| package/file/function) that jumps out to you as "gorgeous?"
| When I look at a random Hashicorp repo, it strikes me an
| impenetrable labyrinth.
| aprdm wrote:
| Try to add a new feature or see how some feature works,
| with consul I did some greps over some features I used and
| followed the code.. was able to put a merge request
| upstream changing a behaviour I didn't like (configurable)
| within 4h (that didn't get accepted and that's OK)
| stanislavb wrote:
| Hey mate. I built, recently, a service that tracks all
| repositories mentioned on HackerNews and Reddit. Based on that
| data you can see which are the most popular or talked about repos
| per language. I guess that can help you. e.g.
| https://www.libhunt.com/lang/go
___________________________________________________________________
(page generated 2021-01-17 23:01 UTC)