Go is a general-purpose programming language created in 2007 designed primarily for the needs of server-side networked application programming.
Go is often favoured for its portability, relative simplicity, ease of concurrent programming, performance and fast build times.
There are several major implementations: gc, gccgo/gollvm, GopherJS and TinyGo.
Go has a published language specification and a v1 compatibility promise which is useful when considering long-term program maintenance.
The loading of program dependencies is based on URLs. This implies always-on internet connectivity and typically centralised git repository hosting. A work-around for this is to use vendoring which supports downloading and bundling all program dependencies into the source tree.
Go can be bootstrapped with Go itself, or C (via gccgo
/gollvm
). However, with the introduction of generics, not all new versions of Go can be bootstrapped with C. gccgo
supports up to version 1.18. It's also possible to bootstrap from Go 1.4, the last version written in C.
There are language design decisions which make Go unsuitable for embedded systems. The TinyGo project aims to provide an alternative.
Go binary sizes are generally acknowledged to be bloated. For example, a binary size of 1.3 MB for 6 lines of code. The design of Go prioritises performance at the cost of memory, embedding considerable amounts of runtime information in produced binaries. Passing flags such as -ldflags="-s -w"
to go build
can aid in size reduction.
Similar to Rust, Go is largely dependent on Big Tech for resources and funding.