Day Four post ready to rock. Also add more spacing before headers in articles.
All checks were successful
Build and copy to prod / build-and-copy (push) Successful in 2m2s
All checks were successful
Build and copy to prod / build-and-copy (push) Successful in 2m2s
This commit is contained in:
parent
5aa6f37604
commit
2209eef082
120
src/blog/posts/2024/5/learning-go-day-4.md
Normal file
120
src/blog/posts/2024/5/learning-go-day-4.md
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
---
|
||||||
|
title: "Learning Go: Day Four"
|
||||||
|
date: 2024-05-04T08:00:00.0Z
|
||||||
|
tags:
|
||||||
|
- learning
|
||||||
|
- go
|
||||||
|
excerpt: "Day Four brings the joys of arrays and structs"
|
||||||
|
---
|
||||||
|
|
||||||
|
We're onto some more complex data structures today: arrays, and structs. I've skipped a couple of sections on the [Tour of Go](https://go.dev/tour) that I'm working through as part of this, but I'll double back to them later (at the time of writing, I don't fully understand what the `defer` statement is used for).
|
||||||
|
|
||||||
|
## Structs
|
||||||
|
|
||||||
|
These are pretty familar to me, purely because I've dabbled in C every now and again. Structs are almost like a precursor to objects, they're custom data types that can be defined and then referred to as argument or return types:
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Date struct {
|
||||||
|
Day int
|
||||||
|
Month int
|
||||||
|
Year int
|
||||||
|
}
|
||||||
|
|
||||||
|
today := Date{4, 5, 2024}
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also explicity declare the struct fields:
|
||||||
|
|
||||||
|
```go
|
||||||
|
tomorrow := Date{Day: 5, Month: 5, Year: 2024}
|
||||||
|
```
|
||||||
|
|
||||||
|
Seems simple enough, no dragons there yet as far as I can tell[^1].
|
||||||
|
|
||||||
|
## Arrays
|
||||||
|
|
||||||
|
Everybody loves a good list. There are massive social media companies whose entire existence is based on lists. So naturally, I want to learn how to use and array. Instantiating an array is fairly straightforward:
|
||||||
|
|
||||||
|
```go
|
||||||
|
var nums [10]int
|
||||||
|
nums[0] = 1
|
||||||
|
nums[1] = 2
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively you can explicity assign every value:
|
||||||
|
|
||||||
|
```go
|
||||||
|
nums := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
|
||||||
|
```
|
||||||
|
|
||||||
|
One thing that's slightly different about arrays in Go compared to how they work in languages like Javascript is that they're statically-sized. If you create an array of 10 items, you can only put 10 items in there, you can't just push an 11th item on.
|
||||||
|
|
||||||
|
## Array slices
|
||||||
|
|
||||||
|
So this is where arrays become a bit more powerful (and slightly convoluted). A slice is a reference to part of an array. They're created similarly to selecting a slice of an array in Python, by using the `array[from:to]` syntax with the start and end indexes you want to :
|
||||||
|
|
||||||
|
|
||||||
|
```go
|
||||||
|
nums := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
|
||||||
|
|
||||||
|
slice := nums[1:5]
|
||||||
|
```
|
||||||
|
|
||||||
|
Now `slice` contains the values `2, 3, 4, 5` - except they're not the values, it's just a `reference` to the values. So if I do `slice[0] = 4`, `nums[1]` will also change:
|
||||||
|
|
||||||
|
```go
|
||||||
|
nums := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
|
||||||
|
|
||||||
|
slice := nums[1:5]
|
||||||
|
|
||||||
|
slice[0] = 4;
|
||||||
|
fmt.Println(nums)
|
||||||
|
|
||||||
|
// Prints: [1 4 3 4 5 6 7 8 9 10]
|
||||||
|
```
|
||||||
|
|
||||||
|
Also, similarly to Python, you can omit either - or both - of the index range values and Go will default:
|
||||||
|
|
||||||
|
```go
|
||||||
|
nums := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
|
||||||
|
|
||||||
|
first_five := nums[:5] // {1, 2, 3, 4, 5}
|
||||||
|
tail := nums[1:] // {2, 3, 4, 5, 6, 7, 8, 9, 10}
|
||||||
|
whole_slice := nums[:] // {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Resizing slices
|
||||||
|
|
||||||
|
Slices are how we get dynamically-resizable arrays in Go, it seems. Provided the underlying array has the capacity, you can extend or shrink a slice:
|
||||||
|
|
||||||
|
```go
|
||||||
|
nums := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
|
||||||
|
|
||||||
|
slice := nums[1:5] // {2, 3, 4, 5}
|
||||||
|
slice = slice[:8] // {2, 3, 4, 5, 6, 7, 8, 9}
|
||||||
|
slice = slice[1:] // {3, 4, 5, 6, 7, 8 9}
|
||||||
|
```
|
||||||
|
|
||||||
|
And finally, Go provides some nice helper functions for slices that mean we can effectively create dyanmic arrays. The `make` function creates a slice with a given length and/or capacity:
|
||||||
|
|
||||||
|
```go
|
||||||
|
dynamic_array := make([]int, 5) // [0, 0, 0, 0, 0]
|
||||||
|
empty_array := make([]int, 0, 5) // []
|
||||||
|
```
|
||||||
|
|
||||||
|
And then `append` can be used to add a value to the slice:
|
||||||
|
|
||||||
|
```go
|
||||||
|
dynamic_array := make([]int, 0) // []
|
||||||
|
|
||||||
|
dynamic_array = append(dynamic_array, 1) // [1]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Thoughts on Go so far
|
||||||
|
|
||||||
|
So far, Go seems good! The syntax is pretty clean, most of the concepts I've come across are fairly familiar on account of having used other low-level languages like C and Rust[^2]. Arrays seem a little bit more complicated than I've been used to, but as far as I can tell using slices in most places should be fine.
|
||||||
|
|
||||||
|
I'm sure I'll hit some rocky patches soon enough, as I'm still only covering the absolute basics, but I'm enjoying it nonetheless.
|
||||||
|
|
||||||
|
[^1]: Famous last words
|
||||||
|
[^2]: Not to be confused with C. Robert Cargill's Sea of Rust
|
@ -30,6 +30,12 @@ article {
|
|||||||
.p-summary {
|
.p-summary {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.e-content {
|
||||||
|
h2, h3 {
|
||||||
|
--vertical-spacing: var(--space-size-xl);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
section[data-section="author"] {
|
section[data-section="author"] {
|
||||||
|
Loading…
Reference in New Issue
Block a user