---
title: "Learning Go: Day Three"
date: 2024-05-03T08:00:00.0Z
tags:
    - learning
    - go
excerpt: "For my third day of learning Go, I'm going to take a look at some control structures"
---

Over the last two days I've learned how to [setup and create a Go project](/post/learning-go-day-1/), and then [how to organise code into packages](/post/learning-go-day-2). I realise I've skipped a crucial step there, though, which is learning how to deal with control structures.

By control structures, I'm referring to things like `for-` loops, `if` statements, etc. You know, the things that make the software do things beyond just multiplying 2 by 5.

## For-loops

The old trusty workhorse of any programming language. These seem pretty straightforward in Go, similar to most other languages:

```go
// maths.go

// Calculate val to the n'th power
func Pow(val, n int) int {
    for i:= 1; i < n; i++ {
        val *= val
    }

    return val
}

// main.go

func main() {
	four_squared := maths.Pow(4, 2)
	fmt.Printf("4^2 = %d\n", four_squared)
}
```

Cool, this worked. I have successfully reinvented a small wheel[^1].

## Do-While

The _other_ trusty workhorse! Most languages have some form of this construct that says something like:

```
while statement is true:
    do something
```

But not Go, apparently! Or at least, not explicitly. In for-loops, the first and last arguments  - defining a variable and performing an operation on it - are totally optional, so a while loop is just a for-loop[^2]:

```go
// maths.go

func Mod(a, b int) int {
    remainder := a
    for remainder >= b {
        remainder -= b
    }
    return remainder
}
```

## If-else-then

The third trusty workhorseman of the Gopocalypse[^3]. Basic if-statements are pretty straightforward:

```go
// maths.go

func Divide(a, b int) int {
    if a == 0 {
        return 0
    }
    
    if b == 0 {
        return 0
    }

    return a / b
}
```

Which could be cleaned up to use else-if:

```go
// maths.go

func Divide(a, b int) int {
    if a == 0 {
		return 0
	} else if b == 0 {
		return 0
	}
}
```

You can also add variable declarations to if-statements, which are then only accessible inside the blocks:

```go
// maths.go

func Min(a, b int) int {
    if v := a - b; v > 0 {
        return b
    } else {
        return a
    }
}
```

Okay, so that's covered most of the control structures off the top of my head. On my to-do list for the next couple of days are: working with arrays, and testing.

[^1]: This particular wheel is a lot slower than the original wheel, but hey, I'm learning
[^2]: Yes, yes, I know that's actually the case in many languages and `while` is just syntactic sugar
[^3]: I'm sorry.




