Getting Started with Go
Updated by Linode Contributed by Mihalis Tsoukalos
Introduction
Go is a modern, open source, and general-purpose programming language that began as an internal Google project and was officially announced at the end of 2009. Go was inspired by many other programming languages including C, Pascal, Alef, and Oberon. Its spiritual fathers were Robert Griesemer, Ken Thomson, and Rob Pike, who all designed Go as a language for professional programmers that want to build reliable, robust, and efficient software. Apart from its syntax and its standard functions, Go comes with a rich standard library.
In this guide you’ll learn how to:
- Execute your first go program
- Learn the syntax for how variables are declared
- See an example of how to work with command line arguments by using the
os
package
The Advantages of Go
Although Go is not perfect, it has many advantages, including the following:
- It is a modern programming language that was made by experienced developers for developers.
- The code is easy to read.
- Go keeps concepts orthogonal, or simple, because a few orthogonal features work better than many overlapping ones.
- The compiler prints practical warnings and error messages that help you solve the actual problem.
- It has support for procedural, concurrent, and distributed programming.
- Go supports garbage collection so you do not have to deal with memory allocation and deallocation.
- Go can be used to build web applications and it provides a simple web server for testing purposes.
- The standard Go library offers many packages that simplify the work of the developer.
- It uses static linking by default, which means that the produced binary files can be easily transferred to other machines with the same OS and architecture. As a consequence, once a Go program is compiled successfully and the executable file is generated, the developer does not need to worry about dependencies and library versions.
- The code is portable, especially among UNIX machines.
- Go can be used for writing UNIX systems software.
- It supports Unicode by default, which means that you do not need any extra code for printing characters from multiple human languages or symbols.
Before You Begin
To run the examples in this guide, your workstation or server will need to have Go installed, and the go
CLI will need to be set in your terminal’s PATH:
- If you use Ubuntu, follow our How to Install Go on Ubuntu guide.
- Follow the Getting Started guide on Golang’s website to install on other operating systems.
If you prefer to experiment with Go without installing it first, you can run the examples found in this guide using the Go Playground.
NoteThis guide was written with Go version 1.13.
Executing Go Code
There are two kinds of Go programs: autonomous programs that are executable, and Go libraries. This section will describe how to format and run autonomous programs.
A Simple Go Program
This is the Go version of the Hello World program:
- helloworld.go
-
1 2 3 4 5 6 7 8 9
package main import ( "fmt" ) func main() { fmt.Println("Hello World!") }
All Go code is delivered within Go packages. For executable programs, the package name should be
main
. Package declarations begin with thepackage
keyword.Executable programs should have a function named
main()
without any function parameters. You cannot have multiplemain()
functions in the files of a single project. Function definitions begin with thefunc
keyword.Note
For more information on how functions in Go are formatted and used, review our Go Functions, Loops, and Errors tutorial.Go packages might include
import
statements for importing other Go packages. However, Go demands that you use some functionality from each one of the packages that you import. There is a way to bypass this rule, however, it is considered a bad practice to do this.The
helloworld.go
file above imports thefmt
package and uses thefmt.Println()
function from that package.Note
All exported package functions begin with an uppercase letter. This follows the Go rule: if you export something outside the current package, it should begin with an uppercase letter. This rule applies even if the field of the Go structure or the global variable is included in a Go package.
For example, if the print function used in the above example was instead named
println()
, it would not be accessible to this program.Go statements do not need to end with a semicolon, as the Go compiler will automatically insert semicolons where they are expected. You are free to use semicolons if you wish. For example, if you want to put two separate statements on a single line, a semicolon is needed between them.
Go has specific rules for how opening curly braces are formatted.
Running the Program
Now that you better understand the
helloworld.go
program, execute it with thego run
command:go run helloworld.go
You will see the following output:
Hello World!
This is the simplest of two ways that you can execute Go code. The
go run
command compiles the code and creates a temporary executable file that is automatically executed, and then it deletes that temporary executable file. This is similar to using a scripting programming language.The second method to execute Go code is to use the
build
command. Run the following command to use this method:go build helloworld.go
The result of that command is a binary executable file that you have to manually execute. This method is similar to the way you execute C code on a UNIX machine. The executable file is named after the Go source filename, which means that in this case the result will be an executable file named
helloworld
. Go creates statically linked executable files that have no dependencies to external libraries.Execute the
helloworld
file:./helloworld
You will see the following output:
Hello World!
Note
Thego run
command is usually used while experimenting and developing new Go projects. However, if you need to transfer an executable file to another system with the same architecture, you should usego build
.
Formatting Curly Braces
The following version of the “Hello World” program will not compile:
- curly.go
-
1 2 3 4 5 6 7 8 9 10
package main import ( "fmt" ) func main() { fmt.Println("Hello World!") }
If you execute the program above, the following error message is generated by the compiler:
go run curly.go
# command-line-arguments
./curly.go:7:6: missing function body
./curly.go:8:1: syntax error: unexpected semicolon or newline before {
This error message is generated because Go requires the use of semicolons as statement terminators in many contexts, and the compiler automatically inserts the required semicolons when it thinks that they are necessary. Putting the opening curly brace (
{
) on its own line makes the Go compiler look for a semicolon at the end of the previous line (func main()
), which is the cause of the error message.There is only one way to format curly braces in Go: the opening curly brace must not appear on its own line. Additionally, you must use curly braces even if a code block contains a single Go statement, like in the body of a
for
loop. You can see an example of this in the first version of thehelloworld.go
program.
Variable Declarations
Go supports assignment (=
) operators and short variable declarations (:=
), demonstrated in this example:
- variables.go
-
1 2 3 4 5 6 7 8 9 10 11 12 13 14
package main import ( "fmt" ) func main() { myFirstVariable := 10 myFirstVariable = 5 var mySecondVariable int = 10 fmt.Println(myFirstVariable) fmt.Println(mySecondVariable) }
With
:=
you can declare a variable and assign a value to it at the same time, without also listing the type of the variable. The type of the variable is inferred from the given value.You can use
=
in two cases:To assign a new value to an existing variable
To declare a new variable, provided that you also specify its type.
For example,
myFirstVariable := 10
andvar mySecondVariable int = 10
will both create variables of typeint
with the value10
.When you specifically want to control a variable’s type, it is safer to declare the variable and its type using
var
and then assign a value to it using=
.
Naming Conventions
The common naming convention for variables in Go is camel case (though it is not required by the compiler), e.g.: myVariableName
.
Every variable whose name begins with a capital letter is exported from the package that it belongs to, e.g.: MyExportedVariableName
. This style is enforced by the compiler.
Uninitialized Variables
Variables that are declared and not assigned a value will have the zero value for its type. For example, this program shows that the zero value for an int is 0
:
- uninitialized.go
-
1 2 3 4 5 6 7 8 9 10
package main import ( "fmt" ) func main() { var aVariable int fmt.Println(aVariable) }
The output from this program is:
go run uninitialized.go
0
NoteThe zero value for a string variable is an empty string.
Value Semantics
If a new variable is declared by assigning another variable to it, then the new variable will be a copy of the first variable. This means that changing the value of either of these variables will not affect the other, as illustrated in this example:
- values.go
-
1 2 3 4 5 6 7 8 9 10 11 12 13
package main import ( "fmt" ) func main() { myFirstVariable := 10 mySecondVariable := myFirstVariable myFirstVariable = 5 fmt.Println(myFirstVariable) fmt.Println(mySecondVariable) }
The output from this program is:
go run values.go
5
10
If you want to manipulate the value of an existing variable, you can use pointers instead.
Working with Command Line Arguments
This section will illustrate how you can work with command line arguments in Go. The presented program finds out the minimum and the maximum integer of the given command line arguments.
- cla.go
-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
package main import ( "fmt" "os" "strconv" ) func main() { if len(os.Args) == 1 { fmt.Println("Please give one or more integers.") return } var min, max int arguments := os.Args temp, err := strconv.Atoi(arguments[1]) if err != nil { fmt.Println("Error encountered, exiting:") fmt.Println(err) return } else { min = temp max = temp } for i := 2; i < len(arguments); i++ { n, err := strconv.Atoi(arguments[i]) if err != nil { fmt.Println("Error encountered, exiting:") fmt.Println(err) return } if n < min { min = n } if n > max { max = n } } fmt.Println("Min:", min) fmt.Println("Max:", max) }
If you need to work with the command line arguments of a Go program you will need to import the os
package. All command line arguments are kept in the os.Args
slice, which you will have to process on your own. As it also happens with C, the first element of os.Args
is the name of the executable, which in this case should not be processed. The len()
function, used on line 10, returns the length of a slice or an array.
If the first command line argument of the program is a valid integer, then both min
and max
are initialized to its value in lines 18-26. Otherwise, the script will exit. Afterwards, the script iterates through any remaining arguments in lines 28-42. This loop compares the remaining arguments’ values to the previous values found and updates min
and max
accordingly.
The output of cla.go
will resemble the following:
go run cla.go -1 2 3
Min: -1
Max: 3
Next Steps
The next guide in our Go language series is our Go Functions, Loops, and Errors tutorial. More advanced guides are listed in the Go section index.
The Standard Go Library
In addition to reading through our guides, you might also want to review Go’s rich, well-tested and handy standard library. The list of the most important Go packages includes the following:
Package name | Description |
---|---|
io |
Used for performing primitive I/O operations. |
bufio |
Used for executing buffered I/O. |
os |
The package offers a platform-independent interface to OS functionality. |
os/signal |
Used for working with OS signals. |
net |
The package provides a portable interface for network I/O. |
net/http |
The package offers HTTP client and server implementations. |
errors |
Used for manipulating errors. |
flag |
Used for working with command line arguments and flags. |
log |
Used for logging. |
log/syslog |
Used for communicating with the system log service. |
math |
Provides mathematical constants and functions. |
strconv |
Used for converting strings to other basic Go data types and vice versa. |
strings |
Used for manipulating Unicode strings. |
sync |
This package offers basic synchronization primitives. Mainly used in concurrent programming. |
testing |
Used for creating automated testing of Go packages. |
time |
This package offers functions for working with time. |
You can find the full list of the packages of the Go standard library here.
More Information
You may wish to consult the following resources for additional information on this topic. While these are provided in the hope that they will be useful, please note that we cannot vouch for the accuracy or timeliness of externally hosted materials.
Join our Community
Find answers, ask questions, and help others.
This guide is published under a CC BY-ND 4.0 license.