Golang Fundamentals - benhall/golang-demo

Golang Fundamentals

Design Philosophy

Go, also known as Golang, is a modern programming language originally developed by Google. It uses high-level syntax similar to scripting languages and is popular for its minimal syntax and innovative handling of concurrency. Go is designed to be simple, reliable, and efficient, with a focus on productivity and ease of use.

Programming Languages

Go is a statically-typed language, which means that the data type of a variable is known at compile time. This is in contrast to dynamically-typed languages, such as Python or JavaScript, where the data type is determined at runtime. Go’s static typing makes it easier to catch errors at compile time, rather than at runtime.

Go is also a compiled language, which means that it is translated into machine code before it is executed. This makes Go programs run faster than interpreted languages, such as Python or JavaScript.

Error Handling

Go has a unique approach to error handling. Instead of using exceptions, Go uses a return value to indicate an error. For example, the os.Open function returns an os.File value and an error value. If the function is successful, the error value will be nil. If there is an error, the error value will be non-nil.

Here is an example of error handling in Go:

file, err := os.Open("example.txt")
if err != nil {
// handle error
}

Generics

Go 1.18 introduces generics, which allow you to write functions and types that can work with different data types. This can help reduce code duplication and make your code more reusable.

Here is an example of a generic function in Go:

func max[T any](a, b T) T {
if a > b {
return a
}
return b
}

This function can be used with any data type that supports the > operator.

Variables

In Go, variables are declared using the var keyword. For example:

var x int = 10

This declares a variable x with the data type int and initializes it to the value 10.

Functions

Functions in Go are declared using the func keyword. For example:

func add(x, y int) int {
return x + y
}

This function takes two int arguments and returns an int value.

Control Flow

Go has several control flow statements, including if, else, for, switch, and select.

The if statement is used to execute a block of code if a condition is true. For example:

if x > 0 {
// do something
}

The for loop is used to iterate over a sequence of values. For example:

for i := 0; i < 10; i++ {
// do something
}

The switch statement is used to execute a block of code based on a value. For example:

switch x {
case 0:
// do something
case 1:
// do something
default:
// do something
}

The select statement is used to wait for a value from multiple channels. For example:

select {
case x := <-ch1:
// do something with x
case y := <-ch2:
// do something with y
}

Structs

Structs in Go are used to define custom data types. For example:

type Point struct {
x int
y int
}

This defines a Point struct with two fields: x and y, both of which have the data type int.

Methods

Methods in Go are functions that are associated with a specific data type. For example:

func (p Point) Distance() float64 {
return math.Sqrt(float64(p.x*p.x + p.y*p.y))
}

This defines a method Distance for the Point struct. The method takes a Point value as its receiver and returns a float64 value.

Defer

The defer keyword in Go is used to postpone the execution of a function until the surrounding function returns. For example:

func main() {
file, err := os.Open("example.txt")
if err != nil {
// handle error
}
defer file.Close()
// do something with file
}

In this example, the file.Close function is deferred until the main function returns. This ensures that the file is closed, even if an error occurs.

Loops

Go has two types of loops: for and range.

The for loop is used to iterate over a sequence of values. For example:

for i := 0; i < 10; i++ {
// do something
}

The range keyword is used to iterate over a collection, such as an array or a slice. For example:

for i, x := range []int{1, 2, 3} {
fmt.Println(i, x)
}

This will print:

0 1
1 2
2 3

Variadic Functions

Variadic functions in Go are functions that can take a variable number of arguments. For example:

func sum(numbers ...int) int {
total := 0
for _, number := range numbers {
total += number
}
return total
}

This function can be called with any number of int arguments. For example:

fmt.Println(sum(1, 2, 3)) // 6
fmt.Println(sum(1, 2, 3, 4)) // 10

Understanding init in Go

The init function in Go is a special function that is called automatically when a package is imported. It is used to initialize variables and perform other setup tasks.

Here is an example of an init function:

func init() {
x = 10
}

var x int

In this example, the init function initializes the x variable to the value 10.

Defining Structs in Go

Structs in Go are used to define custom data types. For example:

type Point struct {
x int
y int
}

This defines a Point struct with two fields: x and y, both of which have the data type int.

Defining Methods in Go

Methods in Go are functions that are associated with a specific data type. For example:

func (p Point) Distance() float64 {
return math.Sqrt(float64(p.x*p.x + p.y*p.y))
}

This defines a method Distance for the Point struct. The method takes a Point value as its receiver and returns a float64 value.

Using Break and Continue Statements When Working with Loops in Go

The break and continue statements are used to control the flow of a loop.

The break statement is used to exit a loop. For example:

for i := 0; i < 10; i++ {
if i == 5 {
break
}
// do something
}

In this example, the loop will exit when i is equal to 5.

The continue statement is used to skip the current iteration of a loop. For example:

for i := 0; i < 10; i++ {
if i % 2 == 0 {
continue
}
// do something
}

In this example, the loop will skip the current iteration if i is even.

How To Define and Call Functions in Go

Functions in Go are declared using the func keyword. For example:

func add(x, y int) int {
return x + y
}

This function takes two int arguments and returns an int value.

Functions can be called by specifying their names and arguments. For example: