Go (Golang) is a statically typed programming language developed by Google, designed to be robust and efficient, especially in concurrent processes.
Introduction
Installing Go
You can download and install Go from its official website golang.org.
Setting the environment variable:
- Windows: Add
C:\Go\binto thePATHenvironment variable. - macOS/Linux: Add
export PATH=$PATH:/usr/local/go/binin your.bash_profileor.bashrcfile.
Verify the Go installation
To check that Go is correctly installed and see the version:
go versionCreate a new project
Create a new Go module and set up the go.mod file that will manage dependencies.
go mod init module_nameBasic Structure of a Program
Basic Program
Example of a program
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}Running a Go program
Compile and run the .go file:
go run file.goCompiling a Go program
Create an executable from the source file.
go build file.goInstalling a Go program
Compile and install the program in your GOPATH/bin.
go installTypes and Variables
Declaring a variable
Go supports variable declaration explicitly with var or with type inference using :=.
var x int = 10
y := 20 // Type inferenceDeclaring multiple variables
You can declare multiple variables in a single line.
var a, b int = 1, 2
c, d := 3, "hello"Basic types in Go
int,float64: Integers and decimals.bool: Boolean (true/false).string: String of text.array: Fixed-length array.slice: Dynamic array.struct: Custom data structure.
Type conversion
Go does not perform automatic type conversions, so you need to convert manually.
x := 42
y := float64(x)Functions
Basic function
Go allows defining functions with explicit input and output types.
func sum(a int, b int) int {
return a + b
}Functions with multiple return values
Functions in Go can return more than one value.
func divide(a, b int) (int, int) {
return a / b, a % b
}Anonymous functions (closures)
Go supports anonymous functions or closures, which can be assigned to variables.
sum := func(a, b int) int {
return a + b
}
fmt.Println(sum(3, 4))Functions with variable parameters
Go allows functions that accept a variable number of arguments.
func sumAll(nums ...int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}Methods
func (p Person) Greet() string {
return "Hello, my name is " + p.Name
}Control Structures
Conditionals
If-else structure
The if conditional can include variable initialization within its declaration.
if x := 10; x > 5 {
fmt.Println("Greater than 5")
} else {
fmt.Println("Less than or equal to 5")
}Switch
The switch in Go does not need break, as it automatically ends the execution of each case.
switch day {
case 1:
fmt.Println("Monday")
case 2:
fmt.Println("Tuesday")
default:
fmt.Println("Another day")
}Loops
For loop
The for loop is the only loop available in Go and can function as while.
for i := 0; i < 5; i++ {
fmt.Println(i)
}Infinite loop
You can create infinite loops using for without conditions.
for {
fmt.Println("Infinite loop")
}Arrays, Slices, and Maps
Arrays
Arrays have a fixed size defined at the time of their creation.
var arr [5]int
arr[0] = 1
fmt.Println(arr)Slices
Slices are dynamic arrays and are more common in Go.
slice := []int{1, 2, 3, 4, 5}
fmt.Println(slice)Use append to add new elements to a slice.
slice = append(slice, 6)Maps
Maps are key-value collections.
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println(m)Structs
Creating a struct
Structs are user-defined data types that can group related data.
type Person struct {
Name string
Age int
}Initializing and accessing a struct
person := Person{Name: "John", Age: 30}
fmt.Println(person.Name)Interfaces
Interfaces in Go define behaviors that a type can implement.
type Animal interface {
sound() string
}Error Handling
Basic error handling
func Divide(a, b int) (int, error) {
if b == 0 {
return 0, fmt.Errorf("cannot divide by zero")
}
return a / b, nil
}Using errors
result, err := Divide(4, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}Input and Output
Reading standard input
var name string
fmt.Print("Enter your name: ")
fmt.Scanln(&name)Writing to a file
file, err := os.Create("file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
file.WriteString("Hello, world!")Concurrency
Goroutine
Goroutines allow concurrent execution of functions.
go func() {
fmt.Println("Hello from the goroutine")
}()Channels
Creating and using channels
Channels are used to synchronize communication between goroutines.
c := make(chan string)
// Sending data to a channel
go func() {
c <- "Message"
}()
// Receiving data from the channel
fmt.Println(<-c)Select
select {
case msg1 := <-ch1:
fmt.Println(msg1)
case msg2 := <-ch2:
fmt.Println(msg2)
default:
fmt.Println("No message received")
}Closing a channel
A channel can be closed when no more data needs to be sent.
close(c)Packages and Modules
Creating and using modules
go mod init module_name
go mod tidy // To clean up dependenciesImporting standard packages
Go includes a robust standard library, which can be imported as needed.
import (
"fmt"
"math"
)Importing local packages
You can organize your code into multiple files and local packages.
import "my_project/mypackage"Creating a package
// In file my_package.go
package my_package
func MyFunction() {
// code
}Adding a dependency to the module
To add an external package to the project, use go get.
go get github.com/gin-gonic/ginUpdating dependencies
Update all the dependencies of the project.
go mod tidyTesting in Go
Writing a unit test
Go includes a native package for testing (testing).
package main
import "testing"
func TestSum(t *testing.T) {
result := sum(2, 3)
if result != 5 {
t.Errorf("Error: expected 5, got %d", result)
}
}Running unit tests
Run all the tests defined in your project.
go testViewing test coverage
Show a report of unit test coverage.
go test -coverUseful Tools
Automatically format code
Go includes a tool to format code according to language conventions.
go fmtGenerate documentation
Generate documentation from comments in the code.
go docAnalyze code
go vet analyzes the code for common potential errors.
go vetCompile for different operating systems
Go allows compiling executables for other operating systems using environment variables.
GOOS=linux GOARCH=amd64 go buildCommon Frameworks and Libraries
Gin
Framework for creating web APIs.
Gorilla Mux
HTTP router.
GORM
ORM for databases.
Viper
Configuration management.