Go (programming language)
Go is a high-level, general-purpose programming language that is statically-typed and compiled. It is known for the simplicity of its syntax and the efficiency of development that it enables through the inclusion of a large standard library supplying many needs for common projects. It was designed at Google in 2007 by Robert Griesemer, Rob Pike, and Ken Thompson, and publicly announced in November 2009. It is syntactically similar to C, but also has garbage collection, structural typing, and CSP-style concurrency. It is often referred to as Golang to avoid ambiguity and because of its former domain name,
golang.org, but its proper name is Go.There are two major implementations:
- The original, self-hosting compiler toolchain, initially developed inside Google;
- A frontend written in C++, called gofrontend, originally a GCC frontend, providing gccgo, a GCC-based Go compiler; later extended to also support LLVM, providing an LLVM-based Go compiler called gollvm.
History
Go was designed at Google in 2007 to improve programming productivity in an era of multicore, networked machines and large codebases. The designers wanted to address criticisms of other languages in use at Google, but keep their useful characteristics:- Static typing and run-time efficiency
- Readability and usability
- High-performance networking and multiprocessing
Go was publicly announced in November 2009, and version 1.0 was released in March 2012. Go is widely used in production at Google and in many other organizations and open-source projects.
In retrospect the Go authors judged Go to be successful due to the overall engineering work around the language, including the runtime support for the language's concurrency feature.
Branding and styling
The gopher mascot was introduced in 2009 for the open source launch of the language. Renée French, who had designed the rabbit mascot for Plan 9, adapted the gopher from an earlier WFMU T-shirt design.In November 2016, the Go and Go Mono fonts were released by type designers Charles Bigelow and Kris Holmes specifically for use by the Go project. Go is a humanist sans-serif resembling Lucida Grande, and Go Mono is monospaced. Both fonts adhere to the WGL4 character set and were designed to be legible with a large x-height and distinct letterforms. Both Go and Go Mono adhere to the DIN 1450 standard by having a slashed zero, lowercase
l with a tail, and an uppercase I with serifs.In April 2018, the original logo was redesigned by brand designer Adam Smith. The new logo is a modern, stylized GO slanting right with trailing streamlines. The gopher mascot remained the same.
Generics
The lack of support for generic programming in initial versions of Go drew considerable criticism. The designers expressed an openness to generic programming and noted that built-in functions were in fact type-generic, but are treated as special cases; Pike called this a weakness that might be changed at some point. The Google team built at least one compiler for an experimental Go dialect with generics, but did not release it.In August 2018, the Go principal contributors published draft designs for generic programming and error handling and asked users to submit feedback. However, the error handling proposal was eventually abandoned.
In June 2020, a new draft design document was published that would add the necessary syntax to Go for declaring generic functions and types. A code translation tool, , was provided to allow users to try the new syntax, along with a generics-enabled version of the online Go Playground.
Generics were finally added to Go in version 1.18 on March 15, 2022.
Versioning
Go 1 guarantees compatibility for the language specification and major parts of the standard library. All versions up through the current Go 1.24 release have maintained this promise.Go uses a
go1.. versioning format, such as go1.24.0 and each major Go release is supported until there are two newer major releases. Unlike most software, Go calls the second number in a version the major, i.e., in go1.24.0 the 24 is the major version. This is because Go plans to never reach 2.0, prioritizing backwards compatibility over potential breaking changes.Design
Go is influenced by C, but with an emphasis on greater simplicity and safety. It consists of:- A syntax and environment adopting patterns more common in dynamic languages:
- * Optional concise variable declaration and initialization through type inference
- * Fast compilation
- * Remote package management and online package documentation
- Distinctive approaches to particular problems:
- * Built-in concurrency primitives: light-weight processes, channels, and the
selectstatement - * An interface system in place of virtual inheritance, and type embedding instead of non-virtual inheritance
- * A toolchain that, by default, produces statically linked native binaries without external Go dependencies
- A desire to keep the language specification simple enough to hold in a programmer's head, in part by [|omitting features that are common in similar languages].
- 25 reserved words
Syntax
Semicolons still terminate statements;
Keywords
Go contains the following keywords, of which there are 25:-
break -
case -
chan -
const -
continue -
default -
defer -
else -
fallthrough -
for -
func -
go -
goto -
if -
import -
interface -
map -
package -
range -
return -
select -
struct -
switch -
type -
varTypes
Go contains the following primitives:
-
bool -
int8 -
uint8 -
int16 -
uint16 -
int32 -
uint32 -
int64 -
uint64 -
int -
uint -
uintptr -
float32 -
float64 -
complex64 -
complex128 -
string
byte is an alias for uint8 and rune is an alias for int32.For each type and each non-negative integer constant, there is an array type denoted ; arrays of differing lengths are thus of different types. Dynamic arrays are available as "slices", denoted for some type These have a length and a capacity specifying when new memory needs to be allocated to expand the array. Several slices may share their underlying memory.
Pointers are available for all types, and the pointer-to- type is denoted . Address-taking and indirection use the and operators, as in C, or happen implicitly through the method call or attribute access syntax. There is no pointer arithmetic, except via the special type in the standard library.
For a pair of types,, the type is the type mapping type- keys to type- values, which can be thought of as equivalent to in other languages. The Go Programming Language specification does not give any performance guarantees or implementation requirements for map types, though it is usually implemented as a hash table. Hash tables are built into the language, with special syntax and built-in functions. is a channel that allows sending values of type between [|concurrent Go processes].
Aside from its support for [|interfaces], Go's type system is nominal: the keyword can be used to define a new named type, which is distinct from other named types that have the same layout. Some conversions between types are pre-defined and adding a new type may define additional conversions, but conversions between named types must always be invoked explicitly. For example, the keyword can be used to define a type for IPv4 addresses, based on 32-bit unsigned integers as follows:
type ipv4addr uint32
With this type definition, interprets the value as an IP address. Simply assigning to a variable of type is a type error.
Constant expressions may be either typed or "untyped"; they are given a type when assigned to a typed variable if the value they represent passes a compile-time check.
Function types are indicated by the keyword; they take zero or more parameters and return zero or more values, all of which are typed. The parameter and return values determine a function type; thus, is the type of functions that take a and a 32-bit signed integer, and return a signed integer and a value of the built-in interface type.
Any named type has a method set associated with it. The IP address example above can be extended with a method for checking whether its value is a known standard:
// ZeroBroadcast reports whether addr is 255.255.255.255.
func ZeroBroadcast bool
Due to nominal typing, this method definition adds a method to, but not on. While methods have special definition and call syntax, there is no distinct method type.